为啥 __builtins__ 既是模块又是字典

Posted

技术标签:

【中文标题】为啥 __builtins__ 既是模块又是字典【英文标题】:why __builtins__ is both module and dict为什么 __builtins__ 既是模块又是字典 【发布时间】:2010-11-14 02:48: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'>

【问题讨论】:

欲了解更多信息,请参阅***.com/questions/11181519/… [可能重复] 您是否尝试改用import builtins?它给了你什么结果?我按照这里 (***.com/questions/61084916/…) 的建议使用了它,它似乎有效。 【参考方案1】:

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

查看文档:

27.3. __builtin__ — Built-in objects

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

【讨论】:

Python3 怎么样? NameError: name '__builtin__' is not defined @warvariuc:模块重命名为builtins 你能回答问题的标题吗? __builtins__ 是不是字典?什么时候是其中一个? OP 的小细节并不像搜索引擎给出的可搜索标题那么相关。请回答。

以上是关于为啥 __builtins__ 既是模块又是字典的主要内容,如果未能解决你的问题,请参考以下文章

python __builtin__模块介绍

模块

python的系统模块builtins快速查看

ModuleNotFoundError:conda中没有名为'__builtin__'的模块

流畅的python 第三张 字典和集合

有没有Python中的函数来打印一个对象的所有当前的属性和值