2012-03-20 6 views
2

クラスまたは関数の宣言の直後にあるPythonドキュメントストリングは、__doc__属性に配置されます。Pythonコードから "余分な"ドキュメンテーションを抽出していますか?

質問:どのようには機能して後に発生し、追加の「内部」ドキュメンテーション文字列を抽出していますか?

アップデート:このようなリテラル文は、コンパイラによって省略されています。おそらく私はASTを経由して(そしてその行番号に)行くことができますか?


なぜ私は尋ねますか?

私は/考えると描写するために、このような「内部」ドキュメンテーション文字列を使用する(完全に焼かれていない)という考えを持っていた場合にはアジャイルシナリオの/後のセクション:ドキュメンテーション文字列を抽出し、テスト - によって

def test_adding(): 
    """Scenario: Adding two numbers""" 
    adder = Adder() 
    """When I add 2 and 3""" 
    result = adder.add(2, 3) 
    """Then the result is 5""" 
    assert result == 5 

私は、これはSEPARを定義する必要がBehaveFreshenLettucePyCukes、中に撮影したアプローチよりも簡潔になると思います

Scenario: Adding two numbers 
    When I add 2 and 3 (PASS) 
    Then the result is 5 (FAIL) 

AssertionError Traceback 
... 

:フレームワークを実行すると、このような出力を生成することがありました各ステップごとに関数を使用しました。私は、ステップのテキストを関数名(@When("I add numbers") def add_numbers())として繰り返す必要はありません。しかし、単体テストのテストとは異なり、ドキュメントストリングは、ビジネス読取り可能なシナリオを印刷して参照する機能を追加します。コンパイラはリテラル文をelides以来

答えて

4

あなたはastモジュールを使用してテストを解析し、手動でこれは(あなたがおそらくast.NodeVisitorまたはast.NodeTransfomerとビジターのパターンを使用することができます)やっての、おそらくより良い方法がありますなど、木とセットアップのテストを歩くことができ、しかし、ここでの例です:

import ast, inspect 

def find_tests(module): 
    # generate AST from module's source 
    tree = ast.parse(inspect.getsource(module)) 
    # return tests in module, assuming they are top level function definitions 
    return [node for node in tree.body if isinstance(node, ast.FunctionDef)] 

def print_docstrings(test): 
    for node in test.body: 
     if isinstance(node, ast.Expr): 
      # print lineno and docstring 
      print node.value.lineno, node.value.s 

if __name__ == '__main__': 
    import test_adding 
    for test in find_tests(test_adding): 
     print_docstrings(test) 

ます。またkoniraに興味があるかもしれません。

+0

'inspect.getsource(module)'を使ってソースを取得することができます。 'ast 'を使う必要はありません。 – jfs

+0

ありがとうございました! – zeekay

+0

'ast'ルートはテストのための新しい構文を導入しているので、私はあなたが' ast'ルートに行くべきかどうかは分かりません。誰かが文字列を置くのを忘れたら? 'with'ステートメントを使ってコンテキストを指定し、それらを使って全体的なテストを構築することができます。 –

2

あなたは、することはできません。

>>> def foo(): 
... 'docstring' 
... 3 
... 'bar' 
... 
>>> dis.dis(foo) 
    4   0 LOAD_CONST    1 (None) 
       3 RETURN_VALUE   
+0

ああ、ドローボードに戻ってください。 – Graham

関連する問題