【问题标题】:Fetching all the Module name, class name and method names from directory in python从python中的目录中获取所有模块名、类名和方法名
【发布时间】:2015-11-18 18:54:16
【问题描述】:

如果一个目录包含多个 .py 文件 说,a.py,b.py,c.py 如何获取包含在该目录中的所有模块名称及其类名称以及最终相应类的所有方法名称

【问题讨论】:

标签: python python-2.7 operating-system


【解决方案1】:

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

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

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

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

【讨论】:

  • 我不能使用您提到的第一种方法收到的模块名称,然后在第二种方法中使用它来获取函数名称吗??
  • 你可以。在第一部分导入模块,如下所示: module = __import__('file')
  • 所以当我这样做时,它说,导入错误:没有名为 Module_name 的模块
  • 您可能需要删除文件扩展名:your_module = __import__(module_file_name.split('.')[0])
【解决方案2】:

如果您不想导入模块,您可以使用 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多