【发布时间】:2015-11-18 18:54:16
【问题描述】:
如果一个目录包含多个 .py 文件 说,a.py,b.py,c.py 如何获取包含在该目录中的所有模块名称及其类名称以及最终相应类的所有方法名称
【问题讨论】:
标签: python python-2.7 operating-system
如果一个目录包含多个 .py 文件 说,a.py,b.py,c.py 如何获取包含在该目录中的所有模块名称及其类名称以及最终相应类的所有方法名称
【问题讨论】:
标签: python python-2.7 operating-system
过滤目录中的文件可以使用('.'指当前目录):
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
它返回一个包含类名元组和函数名列表的列表。不幸的是,它不适用于继承的功能。 它可以很容易地扩展为您提供函数的所有参数。
【讨论】: