Ich habe von einer verzögerten Auswertung in Python gehört (zum Beispiel hier ), bezieht es sich nur darauf, wie Lambdas ausgewertet werden vom Dolmetscher nur wenn sie benutzt werden? Oder ist das der richtige Ausdruck für die Beschreibung, wie aufgrund des dynamischen Designs von Python bis zur Laufzeit nicht viele Fehler auftreten?
Oder fehle ich etwas völlig?
Dietrichs Antwort ist eine gute, aber ich möchte nur hinzufügen, dass die einfachste Form der verzögerten Auswertung die if
Aussage ist:
Dieser Code wird analysiert und korrekt ausgeführt, obwohl die else
-Klausel keinen Sinn ergibt - y
ist nicht definiert. Die else
-Klausel wird nur syntaktisch analysiert - daher sollte Python syntaktisch gültig sein. Dies kann tatsächlich für einige einfache Code verwendet werden:
In einer stark typisierten Sprache würde das nicht funktionieren, weil stuff.contents
erfordert, dass stuff
von einem bestimmten Typ ist, der ein contents
-Attribut hat. In Python ist dies aufgrund der verzögerten Auswertung der Anweisungen in if
nicht unbedingt der Fall. stuff
kann None
sein, das offensichtlich keine Attribute hat, und der Interpreter wird nur die else
-Klausel nehmen, ohne die erste auszuführen. Daher ist dies ein gültiges Python und sogar ein Idiom, das den Code einfacher macht.
Verzögerte Auswertung ist, wenn ein Ausdruck nicht ausgewertet wird, bis er benötigt wird. In den meisten Sprachen verwenden Sie etwas wie lambda
, um dies zu erreichen. Hier ist ein künstliches Beispiel, das einen Teil des Konzepts zeigt:
Hier gibt list_files
eine Reihe von Dateinamen und ein "Thunk" (Lambda ohne Argumente) zurück, das den Inhalt der Datei zurückgibt. Der "Thunk" ist eine verzögerte Auswertung. Mit thunks können Sie Ihre Bedenken trennen:
list_files
durch list_ftp_files
oder list_zip_archive
ersetzt werden. list_files
muss nicht wissen, welche Dateien gelesen werden. Mit Thunks muss es nicht jede einzelne Datei lesen. Bei richtiger verzögerter Auswertung würde sich das "Thunk" nach der Auswertung durch eine ausgewertete Kopie ersetzen, so dass die doppelte Auswertung keine Arbeit mehr wäre als die einmalige Auswertung. Es gibt andere Möglichkeiten, um dasselbe zu erreichen, zum Beispiel mit Klassen und Objekten, die Werte zwischenspeichern.
Deferred Evaluation ist eine (relativ) gebräuchliche Redewendung in Scheme. In Haskell sind Auswertungen standardmäßig verzögert und Sie benötigen keine Syntax, um dies zu tun (es gibt eine spezielle Syntax zum Ausschalten).
Tags und Links python lambda evaluation interpreter