为什么__builtins__既是模块又是字典

22 投票
1 回答
4668 浏览
提问于 2025-04-15 13:09

我正在使用内置模块来插入几个实例,这样它们就可以在全局范围内访问,以便于调试。__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__ 模块(注意是单数)。

你可以看看这个文档:

27.3. __builtin__ — 内置对象

CPython 实现细节:大多数模块都有一个叫 __builtins__(注意有个 's')的名称,它作为全局变量的一部分可用。__builtins__ 的值通常是这个模块本身,或者是这个模块的 __dict__ 属性的值。由于这是一个实现细节,可能在其他 Python 实现中不会被使用。

撰写回答