为什么__builtins__既是模块又是字典
我正在使用内置模块来插入几个实例,这样它们就可以在全局范围内访问,以便于调试。__builtins__
模块的问题在于,它在主脚本中是一个模块,而在其他模块中是一个字典。但是因为我的脚本根据情况可能是主脚本也可能是模块,所以我必须这样做:
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 个回答
18
我觉得你想要的是 __builtin__
模块(注意是单数)。
你可以看看这个文档:
CPython 实现细节:大多数模块都有一个叫
__builtins__
(注意有个's'
)的名称,它作为全局变量的一部分可用。__builtins__
的值通常是这个模块本身,或者是这个模块的__dict__
属性的值。由于这是一个实现细节,可能在其他 Python 实现中不会被使用。