问题 为什么__builtins__既是模块又是dict


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

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'>

1557
2017-07-26 08:05


起源

有关详细信息,请参阅 stackoverflow.com/questions/11181519/...    [可能重复] - pd12


答案:


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

查看文档:

27.3。 __builtin__  - 内置物体

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


11
2017-07-26 08:25



那么Python3呢? NameError: name '__builtin__' is not defined - warvariuc
@warvariuc:模块被重命名为 builtins。 - Martijn Pieters♦