我有以下脚本:
a.py
print(__builtins__.max)
import b
以及以下模块:
b.py
print(__builtins__.max)
使用python3 a.py
启动它们我得到了:
<built-in function max>
Traceback (most recent call last):
File "a.py", line 2, in <module>
import b
File "/home/antonio/Scrivania/b.py", line 1, in <module>
print(__builtins__.max)
AttributeError: 'dict' object has no attribute 'max'
所以我不明白。为什么脚本__builtins__
被分配给内置模块而不是模块__builtins__
被分配给一个字典?
答案 0 :(得分:4)
不要使用__builtins__
;请改用builtins
module。
__builtins__
对象是您不应该依赖的实现细节。来自builtins
模块文档:
作为实现细节,大多数模块都将名称
__builtins__
作为其全局变量的一部分提供。__builtins__
的值通常是此模块或此模块的__dict__
属性的值。由于这是一个实现细节,因此Python的替代实现可能不会使用它。
请注意我的重点;当您访问__builtins__
时,您可以拥有字典或模块对象。
答案 1 :(得分:1)
诚实?当他们在脚本和模块中__builtins__
表示不同的东西时,我无法想象他们在想什么。我使用__builtins__
从一个库中访问内置ImportError
,该库将自己的ImportError
定义为公共API,直到今天它仍适用于我。
我不知道确切的区别。我的__builtins__.ImportError
正在使用Python 2.x和Python 3.x的模块。现在代码中的一些上游更改,相同的构造失败与您的情况完全相同。我使用网络搜索找到了您的问题,我会回答其他可能遇到相同情况的人。
由于上述问题,您无法使用__builtins__
,并且您无法在Python 2.x中使用builtins
,但我设法使用 six python模块修复了此问题。
from six.moves import builtins
这适用于Python 2.x和Python 3.x,它在__builtins__
失败的完全相同的位置工作。希望有所帮助。