2017-12-07 8 views
0

Dies funktioniert:Lambda funktioniert, definierte Funktion nicht

represent_dict_order = lambda self, data: self.represent_mapping('tag:yaml.org,2002:map', data.items()) 
yaml.add_representer(OrderedDict, represent_dict_order) 

Aber gibt mir eine PyCharm Warnung: PEP8: do not assign a lambda expression, use a def

ich den Rat folgen, aber das funktioniert nicht:

def represent_dict_order(self, data): 
    self.represent_mapping('tag:yaml.org,2002:map', data.items()) 
yaml.add_representer(OrderedDict, represent_dict_order) 

Ich bekomme:

yaml.emitter.EmitterError: expected NodeEvent, but got DocumentEndEvent() 

Ich habe zwei Fragen:

  1. Warum ist die lambda arbeiten und die def nicht? Sollen sie nicht gleichwertig sein?
  2. Wie kann ich stoppen PyCharm über diesen spezifischen Fehler beschwert? Ich habe versucht, dem Lambda mit #noinspection vorauszugehen, aber es wird nicht erkannt.
+1

Ihr Lambda hat einen Rückgabewert im Vergleich zu Ihrer Funktionsdefinition mit def. – strippenzieher

+0

@strippenzieher: ooops, impliziter Return, richtig. Peinlich, aber ich werde eine Antwort akzeptieren. – dangonfast

+0

Für Ihre zweite Frage, wenn Sie die PEP8-Warnung meinen, müssten Sie E731 ignorieren.Siehe https://StackOverflow.com/questions/28428307/pycharms-code-style-inspection-ignore-switch-off-specific-rules – strippenzieher

Antwort

1

Lambda-Ausdrücke kommen mit einem implicit return. Daher gibt Ihr Lambda-Ausdruck den Rückgabewert self.represent_mapping zurück, aber Ihre Funktionsdefinition ist nicht auf die fehlende Rückgabe zurückzuführen.

+0

"Explizit ist besser als implizit" :) – dangonfast

Verwandte Themen