为什么__builtins__既是模块又是dict

时间:2009-07-26 08:05:17

标签: python python-module built-in

我使用内置模块插入一些实例,因此可以全局访问它们以进行调试。 __builtins__模块的问题在于它是主脚本中的模块,并且是模块中的dict,但由于我的脚本取决于案例可以是主脚本或模块,我必须这样做:< / p>

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

是否有解决方法,比此更短?更重要的是,为什么__builtins__会这样做?

这是一个看到这个的脚本。创建一个模块a.py:

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

创建模块b.py:

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

现在运行python a.py:

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

1 个答案:

答案 0 :(得分:15)

我想你想要__builtin__模块(注意单数)。

参见文档:

  

27.3. __builtin__ — Built-in objects

     

CPython实现细节:大多数模块的名称为__builtins__(请注意's')作为其全局变量的一部分提供。 __builtins__的值通常是此模块或此模块的[sic] __dict__ 属性的值。由于这是一个实现细节,因此Python的替代实现可能不会使用它。