在Python中调用dir()
当我在Python的解释器中调用dir()
时,实际上是在查询哪个对象呢?
我正在玩一个包,想从全局字典中获取函数的名称。我以为应该用dir(__global)
,但结果不是这样,dir(sys.modules)
也不行。
如果我在一个新的解释器会话中输入dir()
,它会显示:
['__builtins__', '__doc__', '__name__', '__package__']
那么在dir(ob)
中,ob
应该是什么,才能给我同样的结果呢?
2 个回答
0
八年后再看你的问题,我现在想知道你是不是在问在Python提示符下交互运行的dir()
,而我和其他回答者完全没有提到这一点。
如果是这样,实际的答案是:
当你在Python解释器中输入dir()
时,它会在__main__
模块上运行dir()
,因为这是你输入的代码所运行的命名空间。
如果你想自己进行这个操作,只需运行:
import sys
dir(sys.modules['__main__'])
你会看到和在交互模式下运行dir()
时列出的名字完全一样。试着给一个变量赋值,比如a = 1
,然后同时运行普通的dir()
和上面显示的表达式;你会发现它们都显示了同样的名字列表,现在包括了'a'
。
dir()
这个方法会进行复杂而深入的操作,试图预测你查询的对象上可能存在的属性——但它有一个限制,就是无法实际访问它找到的属性名,以查看它们是否会返回AttributeError
。我知道,这个回答的细节比你现在想要的要多;但对于那些以后可能会遇到更复杂需求的人来说,"实现__dir__
(以及在Python中发现错误)"是Michael Food的一篇博客,详细介绍了一些背后的魔法。
2
dir()
这个函数会返回当前环境中的所有名字。现在我记不清它是不是和 locals().keys()
完全一样,或者它们之间有没有什么区别。