我正在使用CPython 3.6.2
,在执行print(dir())
时我得到了:
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
dir
内置函数例如在__builtins__
内,所以如果只为print(dir())
显示上面的模块,我认为这样做python应该已经完成了类似的东西:
import __builtins__
from __builtins__ import *
但如果确实如此,我能够看到使用print(dir())
__builtins__
模块+ dir
以及其他内置函数。
所以我的问题是如何看到预加载的模块(使用dir()
),而不是内置函数,即使我可以直接访问它们(例如,不使用__builtins__.dir
)
答案 0 :(得分:1)
引用文档:
Without arguments, return the list of names in the current local scope.
模块范围中未定义内置函数。就这么简单。
当然,在显式导入它们之后,您可以在本地范围内创建名称,这些名称指向与全局范围内的名称相同的对象。
答案 1 :(得分:1)
这是Python范围解析如何工作的结果。
Dir()返回当前命名空间中的名称列表。那么它为什么不返回内置函数呢?
为什么,因为显然他们不在当前的命名空间。
Import *会将所有模块中的所有函数转储到当前命名空间中,就像您期望的那样,但提供对内置函数的访问并不是必需的。
同样地,如果Python没有找到变量的本地定义,在类或函数内部或其他任何内容,如果它没有找到全局变量,那么Python会回退到全局变量被引用的名称,它开始在 builtins 模块中查找它。
TL; DR - 为什么你不能使用裸dir()看到内置函数?因为他们不在当地范围内,他们不需要在那里工作。