【问题标题】:Python docstrings and inline code; meaning of the ">>>" syntaxPython 文档字符串和内联代码; >>>>" 语法的含义
【发布时间】:2015-07-05 06:56:29
【问题描述】:

我在 Python 方面有一些经验,但直到最近才广泛使用 docstrings。我正在浏览Financial Market Simulator (FMS) 源代码,当我在 PyCharm 中打开它时,我看到以下语法突出显示(FMS 中one of the modules 的代码 sn-p 的屏幕截图):

为什么“>>>”之后的语句像可执行一样突出显示?从我在官方文档和 SO(例如here)上读到的docstrings 中,我认为这些语句不应该执行,但是语法突出显示让我感到困惑,导致我认为 "> >>" 是docstring 中想要执行的代码的标记。或者这只是一个 PyCharm 的“错误”?没有任何文档提到与此相关的任何内容,如果我遗漏了什么,我很担心。

PS:作为记录,查看 SublimeText 中的代码不会重现相同的行为。

【问题讨论】:

    标签: python docstring


    【解决方案1】:

    文档字符串中用>>>写的语句是doctests

    它允许您通过运行文档中嵌入的示例并验证它们是否产生预期结果来测试您的代码。它解析帮助文本以查找示例,运行它们,然后将输出文本与预期值进行比较。

    在您的情况下,PyCharm 完成了在文档字符串中突出显示 python 代码的额外任务。它不会影响您正常的功能执行,因此您无需担心。

    示例:
    假设我有一个名为doctest_simple_addition 的脚本,我在其中为add() 函数编写了一些文档测试,其中一些测试用例提供了正确的输出,而一些则引发了异常。然后我可以通过运行这些文档测试来验证我的函数是否产生了预期的结果。

    doctest_simple_addition.py

    def add(a,b):
        """
        >>> add(1, 2)
        3
    
        >>> add(5, 3)
        8
    
        >>> add('a', 1)
        Traceback (most recent call last):
            ...
        TypeError: cannot concatenate 'str' and 'int' objects
        """
    
        return a + b
    

    要运行文档测试,请通过解释器的-m 选项使用doctest 作为主程序。通常,测试运行时不会产生任何输出。您可以添加-v 选项,然后doctest 将打印它正在尝试的详细日志,并在最后提供摘要。

    Doctest 查找以解释器提示符>>> 开头的行以查找测试用例的开头。测试用例以空行或下一个解释器提示结束。

    $ python -m doctest -v doctest_simple_addition.py 
    
    Trying:
        add(1, 2)
    Expecting:
        3
    ok
    Trying:
        add(5, 3)
    Expecting:
        8
    ok
    Trying:
        add('a', 1)
    Expecting:
        Traceback (most recent call last):
            ...
        TypeError: cannot concatenate 'str' and 'int' objects
    ok
    1 items had no tests:
        doctest_simple_addition
    1 items passed all tests:
       3 tests in doctest_simple_addition.add
    3 tests in 2 items.
    3 passed and 0 failed.
    Test passed.
    

    注意:当 doctest 看到 traceback 标题行(Traceback (most recent call last):Traceback (innermost last):,取决于您运行的 Python 版本)时,它会向前跳过以查找异常类型和消息,完全忽略中间的行。
    这样做是因为回溯中的路径取决于模块在给定系统上的文件系统上的安装位置,并且不可能编写可移植测试,因为路径会因系统而异。

    【讨论】:

      【解决方案2】:

      你的直觉是正确的,他们要被执行。但别担心,它们是doctest 字符串。它们不会干扰模块的正常执行,所以一切都很好。 PyCharm 只是通过识别它们来提供帮助。

      【讨论】:

      • 谢谢!所以doctest>>> 之后在内部运行所有内容,并将输出与在下面的行中依次给出的预期输出进行比较?另外,在我提供的示例中,是实际执行了 Traceback ...MissingParameter.. 函数调用,还是只是在测试失败时将一些文本作为消息打印到屏幕上?
      • @avg 不客气!是的,确切地说,>>> 行之后的所有内容都是预期的输出。 TracebackMissingParameter 只是输出的一部分,在这种情况下是回溯。一开始,您有回溯标头,最后是最后一行的异常类型。如果出现异常,这两行之间的所有内容都会被忽略。
      • 我打算接受你的回答,但@rahul 写了一个更完整的答案,所以我会接受他的。感谢您花时间回答。
      【解决方案3】:

      您看到的行为是 Pycharm 中对 Python 的测试支持的一部分。

      设置选项名为“Analyze Python code in docstrings”,位于Python Integrated Tools:

      如果选中此复选框,PyCharm 会突出显示代码示例并 执行语法检查和代码检查。如果此复选框不是 选中后,不会分析文档字符串中的代码片段。

      如果您愿意,可以禁用它。

      在线文档详细说明了如何run testsview their results

      【讨论】:

      • 谢谢,我最近才开始使用 PyCharm,这很有帮助。
      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 2012-04-04
      • 1970-01-01
      • 2011-03-13
      • 2018-10-10
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      相关资源
      最近更新 更多