你能澄清一下 python 中 __builtins__ 和内置之间的区别吗

Can you clarify the distinction between __builtins__ and builtins in python

提问人:rkg125 提问时间:7/7/2023 最后编辑:zoldxkrkg125 更新时间:7/8/2023 访问量:82

问:

您可以使用许多内置函数,而无需导入任何内容。这些包括 、 、 、 等。但是,如果要查看 的完整列表,则必须首先导入内置函数。pow()open()sum()max()dir()

如果你在没有先导入的情况下执行一个 ,你会得到dir(builtins)builtins

>>> dir(builtins)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'builtins' is not defined

如何在不导入内置函数的情况下使用这些函数,但必须导入内置函数才能查看完整列表?

此外,还有一种叫做的东西,您可以在不导入它的情况下使用它。但这会产生一个完全不同的函数列表。"__builtins__"dir()

这是非常令人困惑的。为什么有两个内置函数,为什么它们的行为不同?

顺便说一句,我在 Mac 上运行。也许在另一个版本中情况有所不同。Python 3.7.11

python python-module 内置

评论

0赞 Peter Wood 7/7/2023
可以定义隐藏内置名称的本地名称。如果要恢复原始文件,它们仍存在于模块中builtins
1赞 Peter Wood 7/7/2023
这将产生一个完全不同的函数列表。-是否确定?
0赞 zoldxk 7/7/2023
__builtins__是一个内置模块,它提供了 Python 中自动提供的一组最小的内置名称,而是一个实际的模块,它使用需要显式导入的其他内置名称来扩展功能。builtins
0赞 rkg125 7/7/2023
@peter木头,你带来了另一个复杂问题。我说你得到一个不同的函数列表的原因是我运行了dir(“builtins”)。但是 dir(builtins),没有引号,直到现在我才运行,生成与 dir(builtins) 相同的列表。此外,您无需导入任何内容即可查看带有 dir(builtins) 的函数名称。仅当想要查看带有 dir(builtins) 的函数名称时,才需要导入 builtins。
0赞 Peter Wood 7/28/2023
dir("builtins")将给出字符串对象的所有属性。你还不如打字,得到同样的结果。dir("rkg125")

答:

0赞 deceze 7/8/2023 #1

文档几乎说明了所有要说的内容:

builtins— 内置对象

该模块提供对 Python [..] 的所有“内置”标识符的直接访问

大多数应用程序通常不会显式访问此模块,但在提供与内置值同名的对象的模块中可能很有用,但其中也需要该名称的内置。

[..]

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

https://docs.python.org/3/library/builtins.html

换句话说,该模块包含一堆“内置”函数,这些函数非常经常需要,以至于语言使它们隐式地可用于您的程序,而无需您显式地使用它们。这只是为了方便程序员。如果需要,您可以显式设置,但通常不会(因为每个模块中都已经提供了 的内容)。builtinsimportimport builtinsbuiltins

__builtins__作为这种神奇地在每个模块中可用的逻辑的副作用而存在。这是一个你不应该太注意的实现细节。

"__builtins__"只是一个任意字符串,没有进一步的含义。 与 或 相同;它检查字符串对象。dir("__builtins__")dir("foo")dir("")