Tabla de símbolos en Python

¿Cómo podemos ver la tabla de símbolos de un código fuente de python?

Quiero decir, Python crea una tabla de símbolos para cada progtwig antes de ejecutarlo. Entonces mi pregunta es ¿cómo puedo obtener esa tabla de símbolos como salida?

Si está preguntando acerca de la tabla de símbolos que se usa al generar el symtable , eche un vistazo al módulo symtable . Además, estos dos artículos de Eli Bendersky son fascinantes y muy detallados:

Python Internals: tablas de símbolos, parte 1

Python Internals: tablas de símbolos, parte 2

En la parte 2, detalla una función que puede imprimir una descripción de una tabla de símbolos, pero parece que fue escrita para Python 3. Aquí hay una versión para Python 2.x:

 def describe_symtable(st, recursive=True, indent=0): def print_d(s, *args): prefix = ' ' *indent print prefix + s + ' ' + ' '.join(args) print_d('Symtable: type=%s, id=%s, name=%s' % ( st.get_type(), st.get_id(), st.get_name())) print_d(' nested:', str(st.is_nested())) print_d(' has children:', str(st.has_children())) print_d(' identifiers:', str(list(st.get_identifiers()))) if recursive: for child_st in st.get_children(): describe_symtable(child_st, recursive, indent + 5) 

Python es dynamic en lugar de estático en la naturaleza. En lugar de una tabla de símbolos como en el código de objeto comstackdo, la máquina virtual tiene un espacio de nombres direccionable para sus variables.

La función dir() o dir(module) devuelve el espacio de nombres efectivo en ese punto del código. Se utiliza principalmente en el intérprete interactivo, pero también se puede usar por código. Devuelve una lista de cadenas, cada una de las cuales es una variable con algún valor.

La función globals() devuelve un diccionario de nombres de variables a valores de variables, donde los nombres de variables se consideran de scope global en ese momento.

La función locals() devuelve un diccionario de nombres de variables a valores de variables, donde los nombres de variables se consideran de scope local en ese momento.

 $ python Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> locals() {'__builtins__': , '__name__': '__main__', '__doc__': None, '__package__': None} >>> globals() {'__builtins__': , '__name__': '__main__', '__doc__': None, '__package__': None} >>> dir() ['__builtins__', '__doc__', '__name__', '__package__'] >>> import base64 >>> dir(base64) ['EMPTYSTRING', 'MAXBINSIZE', 'MAXLINESIZE', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_b32alphabet', '_b32rev', '_b32tab', '_translate', '_translation', '_x', 'b16decode', 'b16encode', 'b32decode', 'b32encode', 'b64decode', 'b64encode', 'binascii', 'decode', 'decodestring', 'encode', 'encodestring', 'k', 're', 'standard_b64decode', 'standard_b64encode', 'struct', 'test', 'test1', 'urlsafe_b64decode', 'urlsafe_b64encode', 'v'] 

Python no crea una tabla de símbolos antes de que se ejecute el progtwig. De hecho, los tipos y funciones pueden definirse (y normalmente se definen) durante la ejecución.

Quizás te interese leer ¿Por qué comstackr código Python?

También vea la respuesta detallada por @wberry

Probablemente disfrutará el artículo de Eli Bendersky sobre el tema aquí.

En CPython, tienes el módulo symtable disponible para ti.

En la parte 2 , Eli describe un método que recorre la tabla de símbolos que es increíblemente útil:

 def describe_symtable(st, recursive=True, indent=0): def print_d(s, *args): prefix = ' ' * indent print(prefix + s, *args) assert isinstance(st, symtable.SymbolTable) print_d('Symtable: type=%s, id=%s, name=%s' % ( st.get_type(), st.get_id(), st.get_name())) print_d(' nested:', st.is_nested()) print_d(' has children:', st.has_children()) print_d(' identifiers:', list(st.get_identifiers())) if recursive: for child_st in st.get_children(): describe_symtable(child_st, recursive, indent + 5)