从 python 中的目录中获取所有模块名称、class 名称和方法名称

Fetching all the Module name, class name and method names from directory in python

如果目录包含多个 .py 文件 比如,a.py、b.py、c.py 我如何获取所有模块名称及其 class 名称以及最终包含在该目录

中的相应 class 的所有方法名称

过滤目录下的文件可以使用('.'指当前目录):

from os import listdir,chdir

default_path = r'c:\dev\python'
modules = [ fl for fl in listdir(default_path) if fl.endswith('.py') ]

要获取 类 和方法,我知道您可以使用检查,但如果不导入模块就无法使用它:

例如

from inspect import getmembers, isfunction, ismethod, isclass
your_module = __import__(modules[0].split('.')[0])

class_funcs = {}    
funcs = [ obj for obj in getmembers(your_module) if isfunction(obj[1]) ]
classes = [ obj for obj in getmembers(your_module) if isclass(obj[1]) ] 

for cls in classes:
    class_funcs[cls[0]] = [ obj for obj in getmembers(cls[1]) if ismethod(obj[1]) ]

print funcs

[('function1', <function your_module.function1>),
('function2', <function your_module.function2>)]

print class_funcs

{'ClassName': [('__init__', <unbound method ClassName.__init__>),
('Method_name', <unbound method ClassName.Method_name>)]}

这将为您提供模块中的所有功能、类、类 方法。

如果您不想导入模块,我不熟悉获取方法的方法(读取文件和使用正则表达式等除外)。

如果您不想导入模块,您可以使用 AST 来检查它们。

import ast
import _ast

def inspect_module(module_path):
    with open(module_path) as mf:
        tree = ast.parse(mf.read())
    module_classes = [_ for _ in tree.body if isinstance(_, _ast.ClassDef)]
    module_classes = [(c.name, [_.name for _ in c.body if isinstance(_, _ast.FunctionDef)]) for c in module_classes]
    return module_classes

它 returns 一个包含 class 名称元组和函数名称列表的列表。不幸的是,它不适用于继承的功能。 它可以很容易地扩展为您提供函数的所有参数。