【问题标题】:Python doctest how to match single or double quote in output as opposed to only single quotePython doctest 如何匹配输出中的单引号或双引号,而不是仅匹配单引号
【发布时间】:2020-06-29 16:58:52
【问题描述】:

我通常使用code auto-formatter Black,它训练我使用双引号。 使用双引号已成为我的“肌肉记忆”。

许多类的默认repr 使用单引号从Python 交互式输出中打印出来。我知道 doctest 试图重现 Python 交互式输出。

有没有一些简单的方法可以让 doctest 匹配单引号或双引号?

我知道一种选择是自定义doctest.OutputChecker。我想知道是否有更简单的选择。


代码示例

from dataclasses import dataclass


@dataclass
class SomeDataClass:
    """Contains a string."""

    data: str


def get_some_dataclass(data: str) -> SomeDataClass:
    """Get a data class containing some specified data.

    Returns:
        Data class containing the data.

    Examples:
        >>> get_some_dataclass("hi")
        SomeDataClass(data="hi")

    """
    return SomeDataClass(data=data)


if __name__ == "__main__":
    import doctest

    doctest.testmod()

输出:

**********************************************************************
File "quote_or_apostrophe.py", line 23, in __main__.get_some_dataclass
Failed example:
    get_some_dataclass("hi")
Expected:
    SomeDataClass(data="hi")
Got:
    SomeDataClass(data='hi')
**********************************************************************

版本

我通过 pytest 的 doctest integration 调用 doctest。

python==3.8.2
pytest==5.4.1

【问题讨论】:

  • 鉴于测试输入是硬编码的,最简单的做法是在预期输出中使用单引号。 Python 不会在两者之间随意切换; str.__repr__ 仅在字符串本身包含双引号时才使用双引号。此处并非如此,因此您可以使用单引号来依赖输出。

标签: python unit-testing doctest


【解决方案1】:

我想你可以通过 blacken-docs 实现这一点,但我还没有看到这样的例子......

任一方法:

  • 将字符串保留为黑色标准(双引号),并找到一种方法来转换预期的输出 doctest,使其具有双引号(以某种方式在其上运行黑色?)
  • 运行 blacken-docs 并应用单引号设置,这也避免了自己考虑它

我会本能地选择第一个选项,因为感觉它可以更好地解决问题,但我希望后者更容易(TBH 不需要考虑太多这将是一个加分)。

不过,在查看它时,目前似乎不支持 according to this issue,并且在某些代码上运行 blacken-docs>>> doctest 块中打印双引号 __repr__ 不会影响所述双引号引用。

我对这个问题以及它所链接的另一个问题的解释是blacken-docs 不支持以下格式的代码块:

"""
Docstring starts here.

Code example comes next:

  >>> from some_module import some_func
  >>> some_func(1, 2)
  "1+2"

"""

我已尝试以建议的格式重写代码:

"""
Docstring starts here.

Code example comes next:

.. code-block:: python

    >>> from some_module import some_func
    >>> some_func(1, 2)
    "1+2"

"""

但这给了我

code block parse error Cannot parse: 1:0: >>> from some_module import some_func

所以我不打算使用 blacken-docs 或更冗长的 .. code-block: python 格式,也许到时候它会被支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2010-09-16
    相关资源
    最近更新 更多