E731 nicht einen Lambda-Ausdruck zuweisen, benutze einen def

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

4 Solutions collect form web for “E731 nicht einen Lambda-Ausdruck zuweisen, benutze einen def”

Die Empfehlung in PEP-8, in die du laufst, ist:

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 anstelle des generischen '' 'spezifisch' f 'ist. Dies ist für Tracebacks und String-Darstellungen im Allgemeinen sinnvoller. Die Verwendung der Zuweisungsanweisung beseitigt den alleinigen Nutzen, den ein Lambda-Ausdruck über eine explizite def-Anweisung anbieten kann (dh dass er in einen größeren Ausdruck eingebettet werden kann)

Zuweisen von Lambdas zu Namen grundsätzlich nur dupliziert die Funktionalität von def – und im Allgemeinen ist es am besten, etwas zu tun, ein einziger Weg, um Verwirrung zu vermeiden und Klarheit zu erhöhen.

Der legitime Anwendungsfall für Lambda ist, wo Sie eine Funktion verwenden wollen, ohne ihn zuzuordnen, zB:

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

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

 a = map(lambda x : x + offset, simple_list) b = map(lambda x : x + offset, another_simple_list) 

Dies ist nur für die Vertretung, ich habe einige verschiedene Versionen davon konfrontiert.

Jetzt, um die Sachen TROCKEN zu halten, fange ich an, dieses gemeinsame Lambda wiederzuverwenden.

 f = lambda x : x + offset a = map(f, simple_list) b = map(f, another_simple_list) 

An diesem Punkt klagt mein Code Qualitätsprüfer über Lambda, der eine benannte Funktion ist, also verwende ich ihn in eine Funktion.

 def f(x): return x + offset a = map(f, simple_list) b = map(f, another_simple_list) 

Jetzt beklagt der Prüfer, dass eine Funktion vor und nach einer Leerzeile begrenzt werden muss.

 def f(x): return x + offset a = map(f, simple_list) b = map(f, another_simple_list) 

Hier haben wir jetzt 6 Zeilen Code anstelle von Original 2 Zeilen ohne Erhöhung der Lesbarkeit und keine Erhöhung der pythonischen. An diesem Punkt klagt der Code-Checker über die Funktion nicht mit docstrings.

Meiner Meinung nach ist diese Regel besser vermieden und gebrochen, wenn es sinnvoll ist, verwenden Sie Ihr Urteil.

Lattyware ist absolut richtig: Grundsätzlich will PEP-8 dir Dinge ähneln

 f = lambda x: 2 * x 

Und stattdessen verwenden

 def f(x): return 2 * x 

Allerdings, wie in einem aktuellen Bugreport (Aug 2014) angesprochen, sind Aussagen wie die folgenden jetzt konform:

 af = lambda x: 2 * x a["f"] = lambda x: 2 * x 

Da mein PEP-8-Checker das noch nicht richtig umsetzt, habe ich E731 vorerst ausgeschaltet.

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

 class SomeClass(object): # pep-8 does not allow this f = lambda x: x + 1 # NOQA def not_reachable(self, x): return x + 1 @staticmethod def also_not_reachable(x): return x + 1 @classmethod def also_not_reachable(cls, x): return x + 1 some_mapping = { 'object1': {'name': "Object 1", 'func': f}, 'object2': {'name': "Object 2", 'func': some_other_func}, } 

In diesem Fall wollte ich wirklich eine Mapping machen, die zur Klasse gehörte. Einige Objekte in der Zuordnung brauchten die gleiche Funktion. Es wäre unlogisch, die benannte Funktion außerhalb der Klasse zu setzen. Ich habe keinen Weg gefunden, auf eine Methode (statische Methode, Klassenmethode oder normal) aus dem Inneren des Klassenkörpers zu verweisen. SomeClass existiert noch nicht, wenn der Code ausgeführt wird. Also auch von der Klasse ist auch nicht möglich.

Python ist die beste Programmiersprache der Welt.