2016-08-18 6 views
2

私はPythonコード(具体的にはユニットテスト)を構造化オブジェクトとして読み込もうとしています。プログラムでPythonコードにアクセスするにはどうすればよいですか?たとえば、クラスやドキュメントストリングなどのリストを取得するなどです。

たとえば、

class ProjectA(unittest.TestCase): 

    def testB(self): 
     """ 
     hello world B 
     """ 
     assert False 

    def testA(self): 
     """ 
     hello world 
     """ 
     assert False 

私はこのようなオブジェクトに辞書を、このコードファイルを読むのが好きでしょう:

{ 
    'classes': [{'ProjectA': [__init__, testA, testB]}] 
} 

これのために私は種皮[「ドキュメント文字列」]を経由して種皮年代を読み取ることができます。


基本的に、私は解析することができるオブジェクトにPythonコードの構造を取得したいと思います。

このようなものは何と呼びますか? (だから私はそれについて読むことができる)

ありがとう!

+0

二つの経路: インスタンス化を名前空間内のクラスとdunderメソッドにアクセスします。 クラスを含む.pyファイルをPythonにテキストファイルとして読み込み、classキーワードとdefキーワードと三重引用符に基づいて情報を抽出します。 – Andrew

+0

'import ; help() 'を実行すると、そのファイルのドキュメントが自動的に生成されます。あなたが探している言葉ではありませんが、おそらく行くべき方法であるすべての文書の文字列をすばやく見たいものがあれば。 –

答えて

2

を使用してクラスを探索することができます - Pythonソースの抽象構文木を生成:すぐに頭に浮かぶ

>>> import ast 
>>> source = '''import unittest 
... 
... 
... class ProjectA(unittest.TestCase): 
... 
...  def testB(self): 
...   """ 
...   hello world B 
...   """ 
...   assert False 
... 
...  def testA(self): 
...   """ 
...   hello world 
...   """ 
...   assert False''' 
>>> tree = ast.parse(source) 
>>> for node in ast.walk(tree): 
... print node 
... 
<_ast.Module object at 0x103aa5f50> 
<_ast.Import object at 0x103b0a810> 
<_ast.ClassDef object at 0x103b0a890> 
<_ast.alias object at 0x103b0a850> 
<_ast.Attribute object at 0x103b0a8d0> 
<_ast.FunctionDef object at 0x103b0a950> 
<_ast.FunctionDef object at 0x103b0ab10> 
<_ast.Name object at 0x103b0a910> 
<_ast.Load object at 0x103b02190> 
<_ast.arguments object at 0x103b0a990> 
<_ast.Expr object at 0x103b0aa10> 
<_ast.Assert object at 0x103b0aa90> 
<_ast.arguments object at 0x103b0ab50> 
<_ast.Expr object at 0x103b0abd0> 
<_ast.Assert object at 0x103b0ac50> 
<_ast.Load object at 0x103b02190> 
<_ast.Name object at 0x103b0a9d0> 
<_ast.Str object at 0x103b0aa50> 
<_ast.Name object at 0x103b0aad0> 
<_ast.Name object at 0x103b0ab90> 
<_ast.Str object at 0x103b0ac10> 
<_ast.Name object at 0x103b27d50> 
<_ast.Param object at 0x103b02410> 
<_ast.Load object at 0x103b02190> 
<_ast.Param object at 0x103b02410> 
<_ast.Load object at 0x103b02190> 
+1

これは正しい答えです、ありがとうございます。 – nubela

関連する問題