从Python代码中提取“额外”文档字符串?

时间:2012-03-20 07:24:45

标签: python docstring

紧跟在类或函数声明之后的Python文档字符串放在__doc__属性中。

问题:如何提取稍后在函数中出现的其他“内部”文档字符串?

更新:编译器省略了这些文字陈述。我可以通过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

通过提取文档字符串,测试运行框架可以生成如下输出:

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

AssertionError   Traceback
...

我认为这比在BehaveFreshenLettucePyCukes中采用的方法更简洁,这需要为每个步骤定义单独的函数。我不喜欢将步骤的文本重复为函数名称(@When("I add numbers") def add_numbers())。但与普通的单元测试不同,文档字符串将增加打印业务可读方案的能力以供参考。

2 个答案:

答案 0 :(得分:4)

您可以使用ast模块解析测试,并手动遍历树和设置测试等。可能有更好的方法(您可以使用ast.NodeVisitor或{{1}或许是访客模式),但这里有一个例子:

ast.NodeTransfomer

您可能也对konira感兴趣。

答案 1 :(得分:2)

你不能,因为编译器省略了文字陈述。

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