如果我有一个模块Test
,如果我需要列出其中的所有功能,我这样做:
import Test
dir(Test)
Run Code Online (Sandbox Code Playgroud)
除非我导入模块,否则我将无法使用其中定义的函数.
但是__builtin__
模块中的所有功能都可以在不导入的情况下使用.但没有import __builtin__
我无法做到dir(__builtin__)
.这是否意味着我们使用这些功能而不导入整个模块?
from __builtin__ import zip
Run Code Online (Sandbox Code Playgroud)
它是否像上面那样?但如果我这样做del zip
,我明白了
NameError:未定义名称"zip"
任何人都可以解释这种行为吗?
正如Python语言文档中所解释的那样,Python中的名称首先在本地范围中查找,然后在任何封闭的本地范围中查找,然后在模块级范围中查找,最后在内置函数的命名空间中查找.所以内置插件在某种程度上是特殊的.它们不会在模块的范围内导入,但如果在其他任何地方找不到名称,Python将在范围内查找它__builtin__
.
请注意,您可以访问此范围的内容而无需导入它.一种可移植的方法是
import sys
print(dir(sys.modules["__builtin__"]))
Run Code Online (Sandbox Code Playgroud)
在CPython中,这也有效
print(dir(__builtins__))
Run Code Online (Sandbox Code Playgroud)
但这被认为是一个实现细节,可能不适用于其他Python实现或未来版本.