2015-08-25 3 views
1

, если каталог содержит несколько файлов .py say, a.py, b.py, c.py Как я могу получить все имя модуля и их название класса и в конечном итоге все имена методов соответствующего класса, contaned в этом каталогеПолучение имени модуля, имени класса и имени метода из каталога в python

+0

См. ['Inspect'] (https://docs.python.org/2/library/inspect.html) –

ответ

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

Это даст вам все функции, классы, методы классов в вашем модуле.

Если вы не хотите импортировать модуль, я не знаком с способом получения методов (кроме чтения файла и использования регулярных выражений и т. Д.).

+0

Могу ли я использовать имя модуля, полученное с использованием первого метода, который вы упомянули, а затем использовать его в 2-й метод для получения имен функций? – Mike786

+0

Вы можете. Импортируйте модуль в первую часть следующим образом: module = __import __ ('file') – equinox93

+0

поэтому, когда я делаю это, он говорит об ошибке импорта: нет модуля с именем Module_name – Mike786

0

Если вы не хотите импортировать модули, вы можете использовать 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 

Он возвращает список, содержащий кортеж имени класса и список имен функций. К сожалению, это не работает для неработающих функций. Его можно легко расширить, чтобы дать вам все аргументы для функций.

Смежные вопросы