'None' als Funktionsparameter übergeben (wobei Parameter eine Funktion ist)

7

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:

%Vor%

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?

    
Andrei Ciobanu 16.09.2010, 21:07
quelle

5 Antworten

7

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.

    
Jochen Ritzel 16.09.2010, 21:46
quelle
7

aktualisieren

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.

    
aaronasterling 16.09.2010 21:12
quelle
3

Vielleicht möchten Sie dies noch einmal überdenken.

%Vor%

Aufrufbare Objekte können Ihr Leben vereinfachen.

    
S.Lott 16.09.2010 21:19
quelle
1
%Vor%     
pyfunc 16.09.2010 21:18
quelle
1

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:

%Vor%

Sie können auch eigene Attribute auf Funktionen setzen:

%Vor%

Ändern Sie dann execfunc.__name__ in getattr(execfunc,'log_info', '')

    
greggo 16.09.2010 21:25
quelle

Tags und Links