2012-01-31 59 views
8

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

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

+4

qué te hace pensar pitón hace una tabla de símbolos? –

+2

@WinstonEwert :: http://docs.python.org/library/symtable.html –

Respuesta

6

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

Python Internals: Symbol tables, part 1

Python Internals: Symbol tables, part 2

En la parte 2, se detalla una función que puede imprimir una descripción de un symtable, pero parece haber sido escrito 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) 
5

Python no crea una tabla de símbolos antes de ejecutar el programa. De hecho, los tipos y funciones pueden ser (y normalmente) definidos durante la ejecución.

Usted puede estar interesado en leer Why compile Python code?

Véase también la respuesta detallada por @wberry

7

Python es dinámico y no estático en la naturaleza. En lugar de una tabla de símbolos como en el código de objeto compilado, 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 usa principalmente en el intérprete interactivo pero también puede ser utilizado 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 las variables se consideran de alcance global en ese momento.

La función locals() devuelve un diccionario de nombres de variables a valores de variables, donde los nombres de las variables se consideran de alcance 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__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None} 
>>> globals() 
{'__builtins__': <module '__builtin__' (built-in)>, '__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'] 
+1

Entonces, ¿qué hace [symtable] (http://docs.python.org/library/symtable.html)? – voithos

+0

Olvidó 'locals()' – Marcin

+0

@voithos Preguntó específicamente sobre el código fuente de Python. No he usado ese módulo, pero creo que es para acceder a los internos de VM o internos de extensión C, que no es lo mismo. – wberry

2

es probable que disfrutar de escritura de Eli Bendersky sobre el tema here

En CPython, tiene el módulo symtable disponible para usted.

En part 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) 
+0

Tenga en cuenta que 'describe_symtable' parece haber sido escrito para Python3. – voithos

Cuestiones relacionadas