¿Alguna diferencia entre dir () y locals () en Python?

De acuerdo con la documentación de Python, tanto dir() (sin argumentos) como locals() evalúan la lista de variables en algo llamado local scope . El primero devuelve una lista de nombres, el segundo devuelve un diccionario de pares nombre-valor. ¿Es la única diferencia? ¿Esto es siempre válido?

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

La salida de dir() cuando se llama sin argumentos es casi igual que locals() , pero dir() devuelve una lista de cadenas y locals() devuelve un diccionario y puede actualizar ese diccionario para agregar nuevas variables.

 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(dir())  

Actualice o agregue nuevas variables usando locals() :

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

usando dir() , sin embargo, esto no funciona:

 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 

La pregunta exacta es ‘qué función usar para verificar si alguna variable está definida en el scope local’.

El acceso a una variable no definida en Python genera una excepción:

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

Al igual que cualquier otra excepción, puedes atraparla:

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

Necesito conocer la architecture del lenguaje para escribir mejor código.

Eso no hará que tu código sea mejor. Nunca debe meterse en una situación en la que se requiera tal cosa, casi siempre es el enfoque equivocado.