2009-07-26 6 views
10

Sto utilizzando il modulo integrato per inserire alcune istanze, quindi è possibile accedervi globalmente a scopo di debug. Il problema con il modulo __builtins__ è che si tratta di un modulo in uno script principale ed è un dict in moduli, ma come il mio script a seconda dei casi può essere uno script principale o un modulo, devo fare questo:perché __builtins__ è sia modulo che dict

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

C'è una soluzione alternativa, più corta di questa? Ancora più importante, perché __builtins__ si comporta in questo modo?

Ecco uno script per vedere questo. Creare un a.py modulo:

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

Creare un b.py modulo:

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

Ora eseguire a.py python:

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

Per ulteriori informazioni, vedere http://stackoverflow.com/questions/11181519/python-whats-the-difference-between-builtin-and-builtins [Possibile duplicato] – pd12

risposta

11

Penso che si desidera che il modulo __builtin__ (nota il singolare).

Vedere la documentazione:

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

Che dire di Python3? 'NameError: name '__builtin__' non è definito' – warvariuc

+0

@warvariuc: il modulo è stato rinominato in [' builtins'] (https://docs.python.org/3/library/builtins.html). –