doctest 忽略省略号后的行首

问题描述 投票:0回答:1

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

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

参考文献

python python-3.x python-3.8 doctest
1个回答
2
投票

doctest
要求异常以某种方式呈现。来自文档

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

(加粗)

这意味着如果您使

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
    """

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


或者,根据实际的代码/测试,catch错误可能更有意义,例如:

def test():
    """
    >>> import re
    >>> try:
    ...     raise re.error(None)  # Obviously this would be different
    ... except re.error as e:
    ...     print(e)
    None
    """
© www.soinside.com 2019 - 2024. All rights reserved.