是否可以列出模块中的所有功能? [复制]
Posted
技术标签:
【中文标题】是否可以列出模块中的所有功能? [复制]【英文标题】:Is it possible to list all functions in a module? [duplicate] 【发布时间】:2011-05-01 17:39:30 【问题描述】:我以这种格式定义了一个 .py 文件:
foo.py
def foo1(): pass
def foo2(): pass
def foo3(): pass
我从另一个文件中导入它:
main.py
from foo import *
# or
import foo
是否可以列出所有函数名称,例如["foo1", "foo2", "foo3"]
?
感谢您的帮助,我为我想要的课程做了一个课程,如果您有任何建议,请发表评论
class GetFuncViaStr(object):
def __init__(self):
d =
import foo
for y in [getattr(foo, x) for x in dir(foo)]:
if callable(y):
d[y.__name__] = y
def __getattr__(self, val) :
if not val in self.d :
raise NotImplementedError
else:
return d[val]
【问题讨论】:
这是个糟糕的主意。使用装饰器枚举你关心的函数。 感谢 Ignacio,但在我的情况下,在每个函数上添加一个 @push_to_list 可能会导致大量替换工作,你能告诉我为什么这是一个坏主意吗? 您可能不希望模块中的所有功能都可用。 【参考方案1】:做这些事情最干净的方法是使用检查模块。它有一个getmembers
函数,它将谓词作为第二个参数。您可以使用isfunction
作为谓词。
import inspect
all_functions = inspect.getmembers(module, inspect.isfunction)
现在,all_functions
将是一个元组列表,其中第一个元素是函数的名称,第二个元素是函数本身。
【讨论】:
我现在没有要测试的 python 环境,列表中的 func 项是否不再需要“导入”来调用 all_functions[0][1](para)? @user478514 您必须首先导入它才能在其上调用getmembers
,但之后,每个元组的第二个元素是一个函数,它的全局变量绑定到它定义的模块的全局变量in. 无需进一步参考该模块。
不知道模块名如何列出当前文件中的所有函数?
哇,真的很酷。比使用dir()
好得多,因为它只提供模块属性(可以通过在模块中定义__getattribute__
来覆盖其行为)。
仅包含在该模块中定义的函数(未导入),请参阅此问题:***.com/questions/1106840/…【参考方案2】:
您可以使用 dir 来探索命名空间。
import foo
print dir(foo)
示例:在 shell 中加载你的 foo
>>> import foo
>>> dir(foo)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'foo1', 'foo2', 'foo3']
>>>
>>> getattr(foo, 'foo1')
<function foo1 at 0x100430410>
>>> k = getattr(foo, 'foo1')
>>> k.__name__
'foo1'
>>> callable(k)
True
>>>
您可以使用 getattr 来获取 foo 中的关联属性,并查看它是否可调用。
查看文档:http://docs.python.org/tutorial/modules.html#the-dir-function
如果你这样做了 - “from foo import *”,那么这些名称将包含在你调用它的命名空间中。
>>> from foo import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'atexit', 'foo1', 'foo2', 'foo3']
>>>
以下关于 python 内省的简介可能会对您有所帮助:
http://www.ibm.com/developerworks/library/l-pyint.html【讨论】:
也看看检查:docs.python.org/library/inspect.html【参考方案3】:喜欢
aaronasterling said,您可以使用 inspect
模块中的 getmembers 函数来执行此操作。
import inspect
name_func_tuples = inspect.getmembers(module, inspect.isfunction)
functions = dict(name_func_tuples)
但是,这将包含已在别处定义的函数,但已导入该模块的命名空间。
如果您只想获取该模块中已定义的函数,请使用此 sn-p:
name_func_tuples = inspect.getmembers(module, inspect.isfunction)
name_func_tuples = [t for t in name_func_tuples if inspect.getmodule(t[1]) == module]
functions = dict(name_func_tuples)
【讨论】:
【参考方案4】:尝试使用下面的检查模块,例如 if module --> temp.py
In [26]: import inspect
In [27]: import temp
In [28]: l1 = [x.__name__ for x in temp.__dict__.values() if inspect.isfunction(x)]
In [29]: print l1
['foo', 'coo']
【讨论】:
【参考方案5】:对于一个狂野的进口
from foo import *
print dir()
您可以使用不带参数的dir()
来显示当前模块命名空间中的对象。这很可能不仅仅包括foo
的内容。
如果是绝对导入(顺便说一下,您应该更喜欢),您可以将模块传递给dir()
:
import foo
print dir(foo)
同时检查documentation of dir
。由于您只需要函数,您可能需要考虑使用inspect.isfunction
。希望您不要将该列表用于非调试目的。
【讨论】:
谢谢,这是否意味着我可能必须过滤 dir() 的结果才能获得所有功能? @user478514:刚刚编辑回答这个问题;)您可以使用inspect.isfunction
。【参考方案6】:
如果想列出当前模块的函数(即,不是导入的),你也可以这样做:
import sys
def func1(): pass
def func2(): pass
if __name__ == '__main__':
print dir(sys.modules[__name__])
【讨论】:
以上是关于是否可以列出模块中的所有功能? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何列出 Linux 中的所有 python 虚拟环境? [复制]
是否可以列出当前在应用程序中的所有 RemoteIO 音频单元?