是否可以列出模块中的所有功能? [复制]

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__])

【讨论】:

以上是关于是否可以列出模块中的所有功能? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何列出 Python 模块中的所有函数?

在Unix中递归列出文件中的所有文件? [复制]

如何列出 Linux 中的所有 python 虚拟环境? [复制]

是否可以列出当前在应用程序中的所有 RemoteIO 音频单元?

SQL:如何在数据库中的所有视图中搜索 ID 并列出提供结果的视图和列名称? [复制]

列出所有子目录中的所有 *.jpg 文件并复制到新文件夹