Ich schreibe eine kleine App, die vor der Ausführung einige 'Plausibilitätsprüfungen' durchführen muss. (zB einer Plausibilitätsprüfung: prüfen, ob ein bestimmter Pfad lesbar / schreibbar ist / existiert)
Der Code:
%Vor% Meine Frage bezieht sich auf die Funktion sanity_check
.
Diese Funktion benötigt 3 Parameter ( bool_func
, true_func
, false_func
). Wenn die bool_func
(die Testfunktion ist, die einen booleschen Wert zurückgibt) fehlschlägt, wird true_func
ausgeführt, andernfalls wird false_func
ausgeführt.
1) lambda: None
ist ein wenig lahm, weil zum Beispiel, wenn der "sanity_access" True liefert, lambda: None
ausgeführt wird und die gedruckte Ausgabe lautet:
Es wird also in den Protokollen nicht klar sein, welche Funktion ausgeführt wurde. Das Protokoll enthält nur <lambda>
. Gibt es eine Standardfunktion, die nichts tut und als Parameter übergeben werden kann? Ist es eine Möglichkeit, den Namen der ersten Funktion, die in einem Lambda ausgeführt wird, zurückzugeben?
Oder eine Möglichkeit, das "exec" nicht zu protokollieren, wenn "nichts" als Parameter gesendet wird?
Was ist das Nicht-Nicht-Nichts-Äquivalent für Funktionen?
%Vor% Zusätzliche Frage, warum funktioniert lambda: pass
anstelle von lambda: None
nicht?
Was ist mit all den Lambdas, die keinen Zweck erfüllen? Nun, vielleicht helfen Ihnen optionale Argumente ein wenig:
%Vor%Aber du bist wirklich überkomplizierende Dinge.
Normalerweise würde ich diesen Beitrag löschen, weil THC4k die ganze Komplexität durchschaut und Ihre Funktion korrekt umgeschrieben hat. Aber in einem anderen Kontext könnte der K-Kombinator-Trick nützlich sein, also lasse ich es stehen.
Es gibt kein eingebautes, was AFIK macht. Ich glaube, dass Sie den K-Kombinator möchten (der Link kam zu einer anderen Frage), der als
kodiert werden kann %Vor%natürlich, wenn dies nur eine einmalige ist, dann könnten Sie einfach tun
%Vor%Aber dann darf man nicht "K-Kombinator" sagen. Ein weiterer Vorteil des Ansatzes "K_combinator" besteht darin, dass Sie ihn an Funktionen übergeben können, z. B.
%Vor% Wie bei Ihrer zweiten Aussage sind nur Ausdrücke in lambda
erlaubt. pass
ist eine Aussage. Daher schlägt lambda: pass
fehl.
Sie können Ihren Aufruf zur Plausibilitätsprüfung etwas vereinfachen, indem Sie das Lambda um das erste Argument entfernen.
%Vor% Dies ist besser lesbar (hauptsächlich durch Erweiterung des ternären Operators zu einem if). Das boolfunc
hat nichts getan, weil sanity_check
dem Aufruf keine Argumente hinzugefügt hat. Könnte auch nur aufrufen, anstatt es in ein Lambda zu wickeln.
Was Sie eigentlich wollen, ist eine Funktion, die nichts tut, aber eine __name__
hat, die für das Protokoll nützlich ist. Die Lambda-Funktion macht genau das, was Sie wollen, aber execfunc.__name__
gibt "<lambda>"
. Probieren Sie eine der folgenden Möglichkeiten aus:
Sie können auch eigene Attribute auf Funktionen setzen:
%Vor% Ändern Sie dann execfunc.__name__
in getattr(execfunc,'log_info', '')