在Python中调用dir()

2 投票
2 回答
1142 浏览
提问于 2025-04-17 06:12

当我在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() 完全一样,或者它们之间有没有什么区别。

撰写回答