Wann ist das lokale Wörterbuch eingestellt?

8

Ein Modul enthält ein Dictionary, um seinen Kontext zu verfolgen, z. B. die Namen, die zu einem bestimmten Zeitpunkt der Ausführung definiert wurden. Dieses Wörterbuch kann über vars(module) (oder module.__dict__ ) aufgerufen werden, wenn module vorhanden ist importiert oder durch Aufruf der locals integrierten Funktion im Modul selbst:

  

Aktualisieren und geben Sie ein Wörterbuch zurück, das die aktuelle lokale Symboltabelle darstellt.

Aber ich war etwas verwirrt, als ich versuchte, das lokale Wörterbuch von einer Funktion aus aufzurufen. Die Ausgabe eines Skripts, das nur Folgendes enthält, ist ein leeres Wörterbuch:

%Vor%

Wenn jedoch ein Skript ausschließlich Folgendes enthält, ist die Ausgabe das erwartete Wörterbuch, das __name__ , __doc__ und die anderen Variablen auf Modulebene enthält:

%Vor%

Also, wann ist der Inhalt des lokalen Wörterbuchs eingestellt? Was bedeutet "update" außerdem in der Definition der Funktion locals ?

    
Right leg 07.09.2017, 12:06
quelle

2 Antworten

7

Der Namespace eines Moduls ist der globale Namespace, auf den über % co_de zugegriffen werden kann % Es gibt keinen separaten lokalen Namespace, also gibt globals() außerhalb von Funktionen nur den globalen Namespace zurück.

Nur Funktionen haben einen lokalen Namespace. Beachten Sie, dass locals() eine einseitige Reflektion dieses Namespace ist. Die CPython-Implementierung für Funktionen ist stark optimiert und Sie können keine lokalen Variablen über das locals() -Wörterbuch hinzufügen oder ändern. Das von locals() zurückgegebene Wörterbuch wird immer dann aktualisiert, wenn sich der Namespace zwischen Aufrufen dieser Funktion geändert hat.

Beachten Sie auch, dass Dinge wie list / dict / set comprehensions, Generator-Ausdrücke und Klassen-Körper in Wirklichkeit auch als Funktionen ausgeführt werden, wenn auch mit unterschiedlichen Namespace-Regeln. In solchen Kontexten gibt locals() auch den lokalen Namespace der separaten Funktion zurück.

    
Martijn Pieters 07.09.2017, 12:07
quelle
1

Wenn Sie locals() mehrmals während des gleichen Funktionsaufrufs aufrufen, wird das gleiche Wörterbuch zurückgegeben.

%Vor%

"Aktualisieren" bedeutet in diesem Fall, dass der Inhalt dieses Wörterbuchs aktualisiert wird, um den aktuellen Umfang der vorhandenen lokalen Variablen widerzuspiegeln. Wenn Sie jedoch einen Verweis auf dieses Wörterbuch beibehalten, wird dieses Wörterbuch weiterhin verwendet.

Beachten Sie auch, dass das lokale Wörterbuch keinen Schlüssel für 'f' enthält, obwohl Sie im Verlauf der Funktion darauf zugreifen konnten. Falls es nicht offensichtlich ist, ist das ein globales, kein lokales.

    
Josh Lee 07.09.2017 12:15
quelle

Tags und Links