2012-10-16 30 views
6

In base alla documentazione Python, sia dir() (senza argomenti) che vengono valutati nell'elenco di variabili in qualcosa chiamato local scope. Il primo restituisce un elenco di nomi, il secondo restituisce un dizionario di coppie nome-valore. È l'unica differenza? È sempre valido?Qualche differenza tra dir() e locals() in Python?

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

Che problema stai cercando di risolvere? Perché hai bisogno di sapere? – phant0m

+1

Ho bisogno di conoscere l'architettura del linguaggio per scrivere codice migliore. La domanda esatta è "quale funzione utilizzare per verificare se alcune variabili sono definite nell'ambito locale". – grigoryvp

risposta

5

L'uscita del dir() quando viene chiamato senza argomenti è quasi uguale a locals(), ma dir() restituisce una lista di stringhe e locals() restituisce un dizionario e si può aggiornare tale dizionario per aggiungere nuove variabili.

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. 

Tipo:

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

aggiornare o aggiungere nuove variabili utilizzando locals():

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

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

utilizzando dir(), tuttavia, questo non funziona:

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

A causa del modo in cui Python ottimizza l'accesso alle variabili locali nelle funzioni, spesso non è possibile modificare le variabili locali usando il dizionario 'locals()', motivo per cui la documentazione mette in guardia contro di essa. – kindall

+1

@kindall ha ragione - dovresti considerare 'locals()' di sola lettura. – DSM

0

domanda esatta è 'quale funzione da utilizzare al fine di verificare se una certa variabile è definita in ambito locale'.

Accesso una variabile non definita in Python solleva un'eccezione:

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

Proprio come qualsiasi altra eccezione, si può prendere:

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

ho bisogno di sapere l'architettura lingua scrivi un codice migliore

Questo non renderà il vostro codice migliore. Si dovrebbe mai mettersi in una situazione in cui è richiesta una cosa del genere, è quasi sempre l'approccio sbagliato.

Problemi correlati