Verzögerte Auswertung in Python

8

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?

    
C-o-r-E 19.02.2010, 05:18
quelle

2 Antworten

8

Dietrichs Antwort ist eine gute, aber ich möchte nur hinzufügen, dass die einfachste Form der verzögerten Auswertung die if Aussage ist:

%Vor%

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:

%Vor%

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.

Referenzdiskussion

    
Eli Bendersky 19.02.2010, 06:32
quelle
14

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:

%Vor%

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:

  • Die for-Schleife muss nicht wissen, wie man Dateien liest, daher könnte list_files durch list_ftp_files oder list_zip_archive ersetzt werden.
  • Die Funktion 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).

    
Dietrich Epp 19.02.2010 05:36
quelle