通过__builtins__访问内置函数

时间:2015-01-20 16:20:11

标签: python python-3.x

我有以下脚本:

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__被分配给一个字典?

2 个答案:

答案 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__失败的完全相同的位置工作。希望有所帮助。