Welche Funktionalität functools.partial
bietet Sie, die Sie nicht durch Lambdas bekommen können?
Nicht viel an zusätzlicher Funktionalität (siehe später) - und die Lesbarkeit liegt im Auge des Betrachters.
Die meisten Leute, die mit funktionalen Programmiersprachen vertraut sind (insbesondere die in den Lisp / Scheme-Familien), scheinen es gut zu mögen lambda
- ich sage "die meisten", definitiv nicht alle, weil Guido und ich sicherlich zu denen gehören, die "vertraut sind" (etc. ) dennoch lambda
als Schandfleck-Anomalie in Python betrachten ...
Er bereute es, es jemals in Python akzeptiert zu haben, während er vorhatte, es aus Python 3 zu entfernen, als eine von "Pythons Pannen".
Ich habe ihn dabei voll unterstützt. (Ich liebe lambda
in Scheme ... während seine Einschränkungen in Python und die seltsame Art und Weise, wie es einfach nicht funktioniert. mit dem Rest der Sprache meine Haut kriechen lassen).
Nicht so jedoch für die Horden von lambda
Liebhabern - der als einer der engstenen Dinge zu einem Aufstand inszeniert jemals in Python Geschichte gesehen, bis Guido Rückzieher und beschlossen , zu verlassen lambda
. In
mehr möglichen Ergänzungen functools
(um Funktionen Rückkehr Konstanten, Identität, etc) ist nicht aufgetreten (um zu vermeiden, dass mehr lambda
Funktionen explizit dupliziert werden ), ist partial
aber natürlich geblieben (es ist keine vollständige Duplizierung, noch ist es ein Dorn im Auge).
Denken Sie daran, dass lambda
der Körper nur ein Ausdruck sein kann , daher gibt es Einschränkungen. Beispielsweise...:
>>> import functools
>>> f = functools.partial(int, base=2)
>>> f.args
()
>>> f.func
<type 'int'>
>>> f.keywords
{'base': 2}
>>>
functools.partial
Die zurückgegebene Funktion ist mit Attributen versehen, die für die Selbstbeobachtung nützlich sind - der Funktion, die sie umschließt, und den darin festgelegten positionellen und benannten Argumenten. Darüber hinaus können die genannten Argumente sofort wieder überschrieben werden (die "Korrektur" ist in gewissem Sinne eher die Einstellung von Standardeinstellungen):
>>> f('23', base=10)
23
Wie Sie sehen, ist es definitiv nicht so einfach wie lambda s: int(s, base=2)
! -)
Ja, Sie könnten Ihr Lambda verzerren, um Ihnen etwas davon zu geben - z. B. für das Überschreiben von Schlüsselwörtern,
>>> f = lambda s, **k: int(s, **dict({'base': 2}, **k))
aber ich hoffe sehr , dass selbst der leidenschaftlichste lambda
Liebhaber diesen Horror nicht lesbarer findet als den partial
Anruf! -). Der Teil "Attributeinstellung" ist noch schwieriger, da die Einschränkung "Python ist ein einzelner Ausdruck" von Python lambda
(plus die Tatsache, dass die Zuweisung niemals Teil eines Python-Ausdrucks sein kann) ... Sie am Ende "Zuweisungen innerhalb eines Ausdrucks vortäuschen". durch Ausdehnung des Listenverständnisses weit über seine Designgrenzen hinaus ...:
>>> f = [f for f in (lambda f: int(s, base=2),)
if setattr(f, 'keywords', {'base': 2}) is None][0]
Kombinieren Sie nun die Überschreibbarkeit der benannten Argumente sowie die Einstellung von drei Attributen in einem einzigen Ausdruck und sagen Sie mir, wie lesbar das sein wird ...!
functools.partial
, die Sie erwähnt haben, Lambda überlegen macht. Vielleicht ist dies das Thema eines anderen Beitrags, aber was stört Sie auf Designebene so sehrlambda
?