Python doctests 中的多行 return 值语句

Multiline return value statements in Python doctests

我正在测试一个函数,该函数在表示时会产生很长的结果,但我不知道如何将该结果放入 doctest。

在这个例子中,我使用的是 pscyopg2,它对其组合查询有详细的表示 (details as to why)

from psycopg2.sql import Literal, Composed

def foo(a, b):
  """
  Examples:
    >>> foo('one', 'two')
    Composed([SQL('SELECT * FROM my_table WHERE a='), Literal('one'), SQL(' AND b='), Literal('two')])
  """

结果行可能会变得很长,我想知道是否可以将其分成多行,例如 ...

的输入表达式

在这种情况下,您要使用 NORMALIZE_WHITESPACE 标志:

def foo('one', 'two')
    """
    Examples:
        >>> foo('one', 'two')
        Composed([
           SQL('SELECT * FROM my_table WHERE a='), Literal('one'),
           SQL(' AND b='), Literal('two')
        ])
    """

if __name__ == '__main__':
    import doctest

    doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)

是的,您可以为此使用 NORMALIZE_WHITESPACE 选项。

来自documentation of the doctest module

doctest.NORMALIZE_WHITESPACE

When specified, all sequences of whitespace (blanks and newlines) are treated as equal. Any sequence of whitespace within the expected output will match any sequence of whitespace within the actual output. By default, whitespace must match exactly. NORMALIZE_WHITESPACE is especially useful when a line of expected output is very long, and you want to wrap it across multiple lines in your source.

第二次强调我的

当你 运行 doctest:

python -m doctest -o NORMALIZE_WHITESPACE my_module.py

或在您的代码示例中添加 option directive

def foo(a, b):
    """
    Examples:
       >>> foo('one', 'two') # doctest: +NORMALIZE_WHITESPACE
       Composed([SQL('SELECT * FROM my_table WHERE a='),
                 Literal('one'), SQL(' AND b='), Literal('two')])
    """