doctest 忽略省略号后的行首

问题描述

文档似乎不太清楚如何解决以下问题......

def test():
    """
    >>> import doctest
    >>> doctest.ELLIPSIS_MARKER = '<ignore>'
    >>> import pandas as pd
    >>> raise pd.errors.InvalidindexError # doctest: +ELLIPSIS,+norMALIZE_WHITESPACE
    Traceback (most recent call last):
     <ignore>
    <ignore>InvalidindexError
    """

import doctest
doctest.run_docstring_examples(test,globals())

这会正常工作,但没有解决 <ignore>InvalidindexError 前面的通配

def test():
    """
    >>> import doctest
    >>> doctest.ELLIPSIS_MARKER = '<ignore>'
    >>> import pandas as pd
    >>> raise pd.errors.InvalidindexError # doctest: +ELLIPSIS,+norMALIZE_WHITESPACE
    Traceback (most recent call last):
     <ignore>
    pandas.errors.InvalidindexError
    """

import doctest
doctest.run_docstring_examples(test,globals())

注意 Pandas 版本是 1.1.3

参考资料

解决方法

doctest 需要异常以某种方式显示。来自the docs

回溯堆栈的每一行(如果存在)必须比示例的第一行缩进得更远,以非字母数字字符开头。回溯标头后面的第一行缩进相同的并以字母数字开头被视为异常详细信息的开始。

(加粗)

这意味着如果您让 ELLIPSIS_MARKER 以字母数字开头,它会正常工作。下面是一个使用 re.error 的示例:

def test():
    """
    >>> import doctest
    >>> doctest.ELLIPSIS_MARKER = 'MODULE.'
    >>> import re
    >>> raise re.error(None) # doctest: +ELLIPSIS
    Traceback (most recent call last):
        ...
    MODULE.error: None
    """
  • 顺便说一句:

    请注意,回溯被非常特殊地对待。特别是,在重写的示例中,... 的使用独立于 doctest 的 ELLIPSIS 选项。该示例中的省略号可以省略,或者也可以是三个(或三百个)逗号或数字,或者是 Monty Python 短剧的缩进抄本。

就上下文而言,这是一个使用两个省略号的示例:

def test():
    r"""
    >>> print('foo\nbar\nbaz') # doctest: +ELLIPSIS
    foo
    ...
    ...
    """

也就是说,IGNORE_EXCEPTION_DETAIL 可能是更好的解决方案。 (我自己才知道。)

指定后,如果引发预期类型的​​异常,即使异常详细信息不匹配,也会通过预期异常的示例。例如,如果引发的实际异常为 ValueError: 42,则期望 ValueError: 3*14 的示例将通过,但会失败,例如,如果引发 TypeError

它还会忽略 Python 3 doctest 报告中使用的模块名称

(加粗)

例如:

def test():
    """
    >>> import re
    >>> raise re.error(None) # doctest: +IGNORE_EXCEPTION_DETAIL
    Traceback (most recent call last):
        ...
    error: foobar
    """

请注意,此示例中忽略了异常模块 异常详细信息。这是故意的,以显示此解决方案的副作用。