2009-07-26 12 views
10

J'utilise le module intégré pour insérer quelques instances, donc on peut y accéder globalement à des fins de débogage. Le problème avec le module __builtins__ est qu'il est un module dans un script principal et est un dict dans les modules, mais comme mon script selon les cas peut être un script principal ou d'un module, je dois le faire:pourquoi __builtins__ est à la fois module et dict

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

Y a-t-il une solution de contournement, plus courte que celle-ci? Plus important encore, pourquoi __builtins__ se comportent de cette façon?

Voici un script pour le voir. Créer un module a.py:

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

Créer un module b.py:

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

a.py python Maintenant, exécutez:

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

Pour plus d'informations, voir http://stackoverflow.com/questions/11181519/python-whats-the-difference-between-builtin-and-builtins [Possible Dupliquer] – pd12

Répondre

11

Je pense que vous voulez le module __builtin__ (notez le singulier).

Voir les docs:

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'en est-il de Python3? 'NameError: le nom '__builtin__' n'est pas défini – warvariuc

+0

@warvariuc: le module a été renommé [' builtins'] (https://docs.python.org/3/library/builtins.html). –