2016-11-03 5 views
0

私は、ユーザーがpythonモジュールを含むフォルダを参照できるようにするプログラムを構築しようとしています。フォルダが選択されると、そのフォルダ内のすべてのPythonファイル、および各モジュールのすべてのクラスとメソッドが一覧表示されます。私の質問は、各ファイルを開き、 "def"または "class"を解析することなくこれを行うことができる方法はありますか?クラスの属性を返すmroという関数があることに気付きましたが、それはインポートを介してそのクラスにアクセスする必要があります。それで私は同じ結果を得ることができる方法はありますか?前もって感謝します!すべてのメソッドとクラスのpythonファイルの解析

+1

あなた可能性'__init __。py'ファイルをフォルダに入れてモジュールとしてロードしてください。こちらをご覧ください:https://docs.python.org/2/tutorial/modules.html#packages – jojo

答えて

0

これは私がASTモジュールを使用して思いついたもので、私が探していたものです。私はここに、私のモジュールの一つで多くのコードを交換しなければならなかった

def fillClassList(file): 
    classList = [] 
    className = None 
    mehotdName = None 
    fileName = "C:\Transcriber\Framework\ctetest\RegressionTest\GeneralTest\\" + file 
    fileObject = open(fileName,"r") 
    text = fileObject.read() 
    p = ast.parse(text) 
    node = ast.NodeVisitor() 
    for node in ast.walk(p): 
     if isinstance(node, ast.FunctionDef) or isinstance(node, ast.ClassDef): 
      if isinstance(node, ast.ClassDef): 
       className = node.name 
      else: 
       methodName = node.name 
      if className != None and methodName != None: 
       subList = (methodName , className) 
       classList.append(subList) 
    return classList 
-1

あなたはファイルの内容を知りたい場合は、周りのファイルを覗く方法はありません:)

あなたの選択は、ダウンあなたは、コンテンツの関心自身、または場合を解析するかどうかに来ますPythonにファイルをロードさせ、見つかったものについてそれを尋ねる必要があります。 (:ない弱い胃とのそれらのための警告):

testme.py:

class Foo (object): 
    pass 

def bar(): 
    pass 

analyze.pyあなたはこのような何かを行うことができます下のtestme.pyのような非常に単純なPythonのファイルについては

import os.path 

files = ['testme.py'] 
for f in files: 
    print f 
    modname = os.path.splitext(f)[0] 
    exec('import ' + modname) 
    mod = eval(modname) 
    for symbol in dir(mod): 
     if symbol.startswith('__'): 
      continue 
     print ' ', symbol, type(eval(modname + '.' + symbol)) 

出力:

testme.py 
    Foo <type 'type'> 
    bar <type 'function'> 

しかし、それはネストされたパッケージやモジュール、壊れたコードを扱うために展開するとかなりうまくいくでしょう。 grepclassdefのほうが簡単で、そこから行くことができます。

お楽しみください!私は:心臓:メタプログラミング

+3

Pythonは "exec"や "eval"よりも優れたソリューションを提供しています。 ... –

+0

私は胃が弱い人ではないと言っていました:) –

+0

「脳にいる人にとってはそうではありません」という意味ですか? –

0

ほとんどのPythonの実装(パーサーが含まれています)はstdlibで利用できるので、慎重にmodules indexを読むことで、必要なものを見つけることができます。気になる最初のモジュール/パッケージはimportlibinspectastですが、確かに他の関心のあるモジュールです。

+0

@Tedあなたの記事にこのコードを投稿してくださいあなたはそれを編集することができます) - コメントでは、それはただ読めません。 –

+0

私の悪い、私はそれを投稿したが、私はそれを変更するために5分待つ必要があったと私はそれについて忘れていた:Pしかし、私はすでに下に行った – Ted

0

は、クラスやメソッドを取得するための私の方法です:

def listClass(file): 

    with open(file,"r") as f: 
     p = ast.parse(f.read()) 

    # get all classes from the given python file. 
    classes = [c for c in ast.walk(p) if isinstance(c,ast.ClassDef)] 

    out = dict() 
    for x in classes: 
     out[x.name] = [fun.name for fun in ast.walk(x) if isinstance(fun,ast.FunctionDef)] 

    return out 

サンプルpprint出力:

{'Alert': ['__init__', 
      'fg', 
      'fg', 
      'bg', 
      'bg', 
      'paintEvent', 
      'drawBG', 
      'drawAlert'], 
'AlertMouse': ['__init__', 'paintEvent', 'mouseMoveEvent'], 
'AlertPopup': ['__init__', 'mousePressEvent', 'keyPressEvent', 'systemInfo']} 
関連する問題