Python - 检索包中多个类下的所有函数

时间:2017-11-22 22:44:30

标签: python python-3.x

我目前有这样的包结构:

common/
    a.py
    b.py
    c.py
    __init__.py
    .svn
util/
    util.py
    __init__.py

我想在util.py中编写一个函数来检索a.py,b.py,c.py中的所有函数

from os import listdir

files = listdir(directory_to_common)
for f in files:
    if '.py' in f and '__' not in f:
        module_name = f.split(.)[0]
        module = __import__(module_name)

我可以成功导入模块。

比我用过

inspect.getmembers(module) 

但它返回了许多不需要的信息。 从这里,我如何检索a.py,b.py,c.py中的函数?

#a.py, b.py, c.py has similar structure as follows:
class A:
    def __init__(self):
        .....
    def method1_in_a(self):
        .....
    def method2_in_a(self):
        .....

2 个答案:

答案 0 :(得分:1)

要仅返回所需信息,请使用可选参数predicate。查找模块中所有类以及类中所有函数的示例:

classes = inspect.getmembers(module, predicate=inspect.isclass)
for cls_name, cls in classes:
    functions = inspect.getmembers(cls, predicate=inspect.isfunction)
        for fn_name, fn in functions:
            print(cls_name, fn_name)

有关所有可用谓词的列表,请参阅inspect module docs(所有名为inspect.isXYZ的函数都是谓词)。

答案 1 :(得分:0)

你可以试试这个:

import inspect
from os import listdir
files = listdir(directory_to_common)
functions = [inspect.getmembers(__import__("{}.{}".format(directory_to_common, i[:-3])), inspect.isfunction) for i in files if i.endswith('.py') and not i.startswith('__')]