【问题标题】:Access builtin functions by __builtins__通过 __builtins__ 访问内置函数
【发布时间】:2015-01-20 16:20:10
【问题描述】:

我有以下脚本:

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

【问题讨论】:

  • @martineau:不,__builtins__ 是全球性的。这就是到处解析内置对象的方式。但它是一个实现细节,一个位置的模块,所有其他位置的字典。
  • 看起来 Python 开发人员没有正确考虑这一点。我打算在 Python 2.x 和 3.x 中使用__builtins__ 在一个模块中普遍访问ImportError,不幸的是,它有自己的ImportError 作为公共API 的一部分。好像不行。

标签: python python-3.x


【解决方案1】:

不要使用__builtins__;请改用builtins module

__builtins__ 对象是您不应依赖的实现细节。来自builtins 模块文档:

作为一个实现细节,大多数模块都有名称__builtins__ 作为其全局变量的一部分。 __builtins__ 的值通常是这个模块或者这个模块的__dict__ 属性的值。由于这是一个实现细节,因此 Python 的替代实现可能不会使用它。

请注意我的重点;当您访问__builtins__ 时,您可以拥有字典或模块对象。

【讨论】:

  • 是的,我知道。但我注意到的很奇怪,你不这么认为吗?
  • @antox:为什么你注意到这很奇怪?文档清楚地表明它是其中之一。该模块被导入一次(进入__main__ IIRC),然后所有其他模块都获得__dict__ 属性。
  • 现在我已经阅读了文献,这并不奇怪,我的错。
  • P.S. IIRC 是什么意思?
  • @martineau:它就在那里。它是字典,而不是模块对象。这就是为什么你得到一个AttributeError,而不是NameError__builtins__ 是字典,__builtins__.max 不是该字典的属性。 __builtins__['max'] 会起作用。
【解决方案2】:

说实话?我无法想象当他们使__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__ 失败的完全相同的地方工作。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2011-09-06
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多