2012-10-16 6 views
6

Laut Python-Dokumentation werden dir() (ohne Argumente) und locals() zu der Liste der Variablen in etwas local scope ausgewertet. Der erste gibt eine Liste von Namen zurück, der zweite gibt ein Wörterbuch mit Name-Wert-Paaren zurück. Ist es der einzige Unterschied? Ist das immer gültig?Irgendein Unterschied zwischen dir() und Einheimischen() in Python?

assert dir() == sorted(locals().keys()) 
+0

Welches Problem versuchen Sie zu lösen? Warum willst du das wissen? – phant0m

+1

Ich brauche Spracharchitektur, um besseren Code zu schreiben. Genaue Frage ist, welche Funktion zu verwenden ist, um zu überprüfen, ob eine Variable im lokalen Gültigkeitsbereich definiert ist. – grigoryvp

Antwort

5

Der Ausgang des dir(), wenn sie ohne Argumente aufgerufen ist fast gleich wie locals(), aber dir() gibt eine Liste von Strings und locals() gibt ein Wörterbuch und du das Wörterbuch aktualisieren können neue Variablen hinzufügen.

dir(...) 
    dir([object]) -> list of strings 

    If called without an argument, return the names in the current scope. 


locals(...) 
    locals() -> dictionary 

    Update and return a dictionary containing the current scope's local variables. 

Typ:

>>> type(locals()) 
<type 'dict'> 
>>> type(dir()) 
<type 'list'> 

aktualisieren oder neue Variablen locals():

In [2]: locals()['a']=2 

In [3]: a 
Out[3]: 2 

dir() verwenden, jedoch funktioniert das nicht:

In [7]: dir()[-2] 
Out[7]: 'a' 

In [8]: dir()[-2]=10 

In [9]: dir()[-2] 
Out[9]: 'a' 

In [10]: a 
Out[10]: 2 
+3

Aufgrund der Art und Weise, wie Python den Zugriff auf lokale Variablen in Funktionen optimiert, ist es häufig nicht möglich, lokale Variablen mit dem 'locals()' Dictionary zu ändern, weshalb die Dokumentation davor warnt. – kindall

+1

@ Kindall ist richtig - Sie sollten 'Locals()' nur lesen. – DSM

0

Genaue Frage ist: ‚Was zu verwenden, um funktionieren zu überprüfen, ob eine Variable in lokalem Bereich definiert ist‘.

eine undefinierte Variable in Python Zugriff auf eine Ausnahme auslöst:

>>> undefined 
NameError: name 'undefined' is not defined 

Genau wie jede andere Ausnahme, können Sie es fangen:

try: 
    might_exist 
except NameError: 
    # Variable does not exist 
else: 
    # Variable does exist 

Ich brauche Sprache Architektur kennen schreibe besseren Code.

Das macht Ihren Code nicht besser. Sie sollten nie bekommen in eine Situation, in der so etwas erforderlich ist, ist es fast immer der falsche Ansatz.

Verwandte Themen