2015-08-25 33 views

回答

1

contaned要過濾的文件,你可以使用目錄(「」是指當前目錄):

from os import listdir,chdir 

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

爲了獲得我知道的類和方法,您可以使用inspect,但不能在不導入模塊的情況下使用它:

例如

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

無法使用您提到的第一種方法接收的模塊名稱,然後將其用於第二種獲取函數名稱的方法? – 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 

它返回一個包含類名稱的元組和列表的函數名稱列表的列表。不幸的是,它不適用於固定的功能。 它可以很容易地擴展爲給你所有的函數參數。

相關問題