例如,有 os.path.walk , os.walk 并假设另一个 md.walk ,并假设导入os 但 md 不导入。我希望像
这样的功能whereis('walk')
虽然可以返回 os.path.walk , os.walk 和 md.walk 。
或者,如果很难知道有 md.walk ,那么如何获取导入的 os.path.walk 和 os。步行
答案 0 :(得分:3)
好的,这很有趣,这是更新的解决方案。一些Python魔术,Python 2.7的解决方案。欢迎任何改进。它的行为与任何其他导入相同 - 因此请小心将if name == "__main__"
中的任何可执行代码包装起来。
import inspect
import pkgutil
import sys
def whereis_in_globals(fname):
return [m for m in sys.modules.itervalues()
if module_has_function(m, fname)]
def whereis_in_locals(fname):
modules = (__import__(module_name, globals(), locals(), [fname], -1)
for _, module_name, _ in pkgutil.walk_packages(path="."))
return [m for m in modules if module_has_function(m, fname)]
def module_has_function(m, fname):
return hasattr(m, fname) and inspect.isfunction(getattr(m, fname))
if __name__ == "__main__":
# these should never raise AttributeError
for m in whereis_in_locals('walk'):
m.walk
for m in whereis_in_globals('walk'):
m.walk
答案 1 :(得分:1)
您能告诉我们有关您的用例或更大目标的更多信息吗?对非导入模块的解答是一个有趣的挑战,我对你的表达方式没有答案,但根据你的实际使用情况,你可能有兴趣知道可能是IDE(集成开发环境)可以做你要求的事情。
例如,如果您安装PyCharm(在社区版中免费提供),您可以键入完整或部分功能名称(只是文本字符串),然后让IDE搜索活动项目以查看您可能的内容正在寻找。例如,你可以输入" walk"在一行上然后(IIR)按住Ctrl键并单击它以查看可能具有匹配功能的可能模块。您还可以搜索其他方向,查看项目在何处使用该函数。
要大范围搜索,您可能需要作弊并打开您的Python目录作为"项目"但这很容易。
同样,您还没有提供用例,所以如果您是专门寻找的话,我会道歉,例如,以脚本方式获取该结果以供以后在程序中使用。如果您希望得到答案,作为开发人员和工作,您可能会查看您用来提供答案的工具。