为什么Python内置函数没有显示在dir()上

时间:2017-08-02 09:14:22

标签: python

我正在使用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

2 个答案:

答案 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()看到内置函数?因为他们不在当地范围内,他们不需要在那里工作。