关于python:是否可以列出模块中的所有函数?

Is it possible to list all functions in a module?

本问题已经有最佳答案,请猛点这里访问。

我定义了一个.py文件,格式如下:

P.Py

1
2
3
def foo1(): pass
def foo2(): pass
def foo3(): pass

我从另一个文件导入它:

Me.Py

1
2
3
from foo import *
# or
import foo

是否可以列出所有函数名,如["foo1","foo2","foo3"]

谢谢你的帮助,我为我想要的东西做了一个班,如果你有建议,请评论。

1
2
3
4
5
6
7
8
9
10
11
12
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]


最干净的方法就是使用检查模块。它有一个以谓词为第二个参数的getmembers函数。您可以使用isfunction作为谓词。

1
2
3
 import inspect

 all_functions = inspect.getmembers(module, inspect.isfunction)

现在,all_functions将是一个元组列表,其中第一个元素是函数的名称,第二个元素是函数本身。


您可以使用dir来探索名称空间。

1
2
import foo
print dir(foo)

示例:在shell中加载foo

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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 dir函数

如果您这样做——"从foo导入*",那么名称将包含在您调用它的名称空间中。

1
2
3
4
>>> from foo import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'atexit', 'foo1', 'foo2', 'foo3']
>>>

以下关于python自省的简短介绍可能会帮助您:

  • http://www.ibm.com/developerworks/library/l-pyint.html


喜欢aaronasterling说,您可以使用来自inspect模块的getmembers函数来完成这项工作。

1
2
3
4
import inspect

name_func_tuples = inspect.getmembers(module, inspect.isfunction)
functions = dict(name_func_tuples)

但是,这将包括在其他地方定义但导入到该模块命名空间的函数。

如果只想获取该模块中定义的函数,请使用以下代码段:

1
2
3
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)

如果模块>temp.py,请尝试如下使用exmaple的inspect模块

1
2
3
4
5
6
7
8
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']

如果想要列出当前模块的函数(即,不是导入的模块),也可以这样做:

1
2
3
4
5
6
import sys
def func1(): pass
def func2(): pass

if __name__ == '__main__':
    print dir(sys.modules[__name__])

为了一个疯狂的进口

1
2
from foo import *
print dir()

您可以在没有参数的情况下使用dir()来显示当前模块命名空间中的对象。这很可能不仅仅包括foo的内容。

如果是绝对导入(顺便说一下,您应该更喜欢),您可以将模块传递给dir()

1
2
import foo
print dir(foo)

还要检查dir的文档。因为您只需要函数,所以可能需要考虑使用inspect.isfunction。希望您不要将该列表用于非调试目的。