Ce que la fonctionnalité n'
functools.partielle de l'offre que vous ne pouvez pas
passer à travers les lambdas?
Pas beaucoup en termes de supplément de fonctionnalités (mais, à voir plus tard) - et, la lisibilité est dans l'oeil du spectateur. La plupart des gens qui sont familiers avec les langages de programmation fonctionnelle (ceux du Lisp/Scheme familles en particulier) semblent comme lambda
seulement des beaux -- je dis "la plupart", certainement pas tous, parce que Guido et j'sont certainement parmi ceux-ci "familier" (etc), mais la pense de lambda
comme une pollution visuelle anomalie en Python... il s'est repenti de l'avoir jamais accepté en Python et prévu de l'enlever en Python 3, comme l'un des "Python pépins", et je suis entièrement pris en charge lui. (J'adore lambda
sur le Schéma... mais ses limites en Python, et la façon bizarre, il ne s'intègre pas dans le reste de la langue, faire de ma peau ramper).
Il n'est pas, cependant, pour les hordes de lambda
amoureux-qui met en scène l'un des plus proches choses à une rébellion jamais vu en Python de l'histoire, jusqu'à ce que Guido fait marche arrière et a décidé de quitter lambda
. Plusieurs ajouts possibles pour functools
(pour faire des fonctions retournant des constantes, de l'identité, etc) n'a pas eu lieu (pour éviter explicitement reproduire le plus de lambda
s'de la fonctionnalité), mais partial
ne restent évidemment (il n'est pas total, la duplication, ni est-il une horreur).
Rappelez-vous que lambda
's du corps est limitée à une expression, il y a donc des limites. Par exemple...:
>>> import functools
>>> f = functools.partial(int, base=2)
>>> f.args
()
>>> f.func
<type 'int'>
>>> f.keywords
{'base': 2}
>>>
functools.partial
s'est retourné fonction est décoré avec des attributs utiles pour l'introspection -- la fonction de l'emballage, et ce de position et les arguments nommés elle fixe qui y est. En outre, les arguments nommés peut être substituée à l'arrière droit (la "fixation" est plutôt, en un sens, la définition des valeurs par défaut):
>>> f('23', base=10)
23
Donc, comme vous le voyez, c'est definely pas aussi simpliste que lambda s: int(s, base=2)
!-)
Oui, vous pourrait se contorsionner votre lambda pour vous donner un peu de cela -- par exemple, pour le mot-dominante,
>>> f = lambda s, **k: int(s, **dict({'base', 2}, **k))
mais j'cher espoir que même les plus ardents lambda
-amant ne considère pas cette horreur plus lisible que l' partial
appeler!-). Et, l'attribut "réglage" la partie est encore plus difficile, en raison de la "le corps est une expression unique" limitation de Python lambda
(plus le fait que la cession ne peut jamais faire partie d'une expression Python)... en fin de compte vous "de truquer les affectations au sein de l'expression" par l'étirement de compréhension de liste bien au-delà de ses limites de conception...:
>>> f = [f for f in (lambda f: int(s, base=2),)
if setattr(f, 'keywords', {'base': 2}) is None][0]
Maintenant combiner les nom-arguments overridability, plus le réglage de trois attributs, en une seule expression, et dites-moi juste comment lisible qui va être...!-)