2009-07-26 16 views
10

Estoy utilizando el módulo integrado para insertar algunas instancias, por lo que se puede acceder a ellas de forma global para fines de depuración. El problema con el módulo __builtins__ es que se trata de un módulo en un script principal y es un diccionario en módulos, pero como mi guión en función de los casos puede ser un script principal o un módulo, tengo que hacer esto:por qué __builtins__ es el módulo y dict

if isinstance(__builtins__, dict): 
    __builtins__['g_frame'] = 'xxx' 
else: 
    setattr(__builtins__, 'g_frame', 'xxx') 

¿Hay una solución, más corta que esto? Más importante aún, ¿por qué __builtins__ se comporta de esta manera?

Aquí hay una secuencia de comandos para ver esto. Crear un módulo de a.py:

#module-a 
import b 
print 'a-builtin:',type(__builtins__) 

Crear una b.py módulo:

#module-b 
print 'b-builtin:',type(__builtins__) 

Ahora ejecute a.py pitón:

$ python a.py 
b-builtin: <type 'dict'> 
a-builtin: <type 'module'> 
+0

Para obtener más información, ver http://stackoverflow.com/questions/11181519/python-whats-the-difference-between-builtin-and-builtins [Posible duplicado] – pd12

Respuesta

11

Creo que desea que el módulo de __builtin__ (nota el singular).

Consulte los documentos:

27.3. __builtin__ — Built-in objects

CPython implementation detail: Most modules have the name __builtins__ (note the 's') made available as part of their globals. The value of __builtins__ is normally either this module or the value of this modules’s [sic] __dict__ attribute. Since this is an implementation detail, it may not be used by alternate implementations of Python.

+0

¿Qué hay de Python3? 'NameError: nombre '__builtin__' no está definido' – warvariuc

+0

@warvariuc: el módulo se renombró a [' builtins'] (https://docs.python.org/3/library/builtins.html). –

Cuestiones relacionadas