Frage

Ich erhalte diese pep8-Warnung, wenn ich Lambda-Ausdrücke verwende.Werden Lambda-Ausdrücke nicht empfohlen?Wenn nicht, warum?

War es hilfreich?

Lösung

Die Empfehlung in PEP-8 Sie stoßen auf Folgendes:

Verwenden Sie immer eine DEF -Anweisung anstelle einer Zuweisungsanweisung, die einen Lambda -Ausdruck direkt an einen Namen bindet.

Ja:

def f(x): return 2*x 

NEIN:

f = lambda x: 2*x 

Die erste Form bedeutet, dass der Name des resultierenden Funktionsobjekts spezifisch 'f' anstelle des generischen 'istu003Clambda> '.Dies ist nützlicher für Tracebacks und String -Darstellungen im Allgemeinen.Die Verwendung der Zuweisungsanweisung beseitigt den alleinigen Nutzen, den ein Lambda -Ausdruck gegenüber einer expliziten DEF -Anweisung bieten kann (dhdass es in einen größeren Ausdruck eingebettet werden kann)

Das Zuweisen von Lambdas zu Namen dupliziert im Grunde nur die Funktionalität von def – und im Allgemeinen ist es am besten, etwas auf eine einzige Weise zu tun, um Verwirrung zu vermeiden und die Klarheit zu erhöhen.

Der legitime Anwendungsfall für Lambda besteht darin, dass Sie eine Funktion verwenden möchten, ohne sie zuzuweisen, z. B.:

sorted(players, key=lambda player: player.rank)

Für einfache Operationen, Die operator Modul bietet einige nützliche Optionen in attrgetter, itemgetter Und methodcaller Dies kann oft Labmdas ersetzen, die nur auf Attribute, Elemente und aufrufende Methoden zugreifen.

Zum Beispiel könnte das oben Gesagte mit erledigt werden operator.attrgetter etwa so:

sorted(players, key=operator.attrgetter('rank'))

Andere Tipps

Hier ist die Geschichte, ich hatte eine einfache Lambda-Funktion, die ich zweimal benutzte.

generasacodicetagpre.

Dies ist nur für die Darstellung, ich habe ein paar verschiedene Versionen davon konfrontiert.

Jetzt, um die Dinge trocken zu halten, wiederverwenden Sie dieses gemeinsame Lambda.

generasacodicetagpre.

An diesem Punkt beschwert sich der Codequalitäts-Checker über Lambda, um eine benannte Funktion zu sein, sodass ich sie in eine Funktion umwandele.

generasacodicetagpre.

Nun klagt der Checker, dass eine Funktion von einer leeren Linie vor und nachher begrenzt sein muss.

generasacodicetagpre.

Hier haben wir jetzt 6 Codezeilen anstelle von Original 2-Zeilen, ohne die Lesbarkeitssteigerung zu steigern, und es ist keine Erhöhung des Pythoniks.An diesem Punkt beschwert sich der Code-Checker über die Funktion, die nicht docstrings hat.

Meiner Meinung nach wird diese Regel besser vermieden und gebrochen, wenn es sinnvoll ist, Ihr Urteilsvermögen nutzen.

latyware ist absolut richtig: Grundsätzlich Pep-8 möchte, dass Sie Dinge vermeidenwie

generasacodicetagpre.

und stattdessen verwenden

generasacodicetagpre.

jedoch in einem kürzlich gerichteten bugreport (Aug 2014), Anweisungen wie folgt jetzt nachgiebig:

generasacodicetagpre.

Da mein PEP-8-Checker dies nicht ordnungsgemäß implementiert, wurde ich vorerst E731 ausgeschaltet.

Ich habe auch eine Situation angetroffen, in der es sogar unmöglich war, eine def (ined) -Funktion zu verwenden.

generasacodicetagpre.

In diesem Fall wollte ich wirklich ein Mapping machen, das der Klasse gehörte.Einige Objekte in der Mapping benötigen dieselbe Funktion.Es wäre unlogisch, die eine benannte Funktion außerhalb der Klasse zu setzen. Ich habe keinen Weg gefunden, sich auf eine Methode (staticmethod, classmethod oder normal) von innen des Klassenkörpers zu beziehen.SOMECLASS ist noch nicht vorhanden, wenn der Code ausgeführt wird.So ist auch nicht mit Bezug auf sie von der Klasse nicht möglich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top