python3代码不会在doctest中产生错误,但是在不使用doctest的情况下运行时仍可正常工作

问题描述 投票:0回答:1
"""
>>> ip_tuple = process("2\t1.001451000\t192.168.0.24\t\t10.0.0.5\t\t98\t84\t\t\t\t\t\t\t\t1")

"""
import doctest
def process(line):
    list_lines = line.split('\t')
    return (list_lines[2], int(list_lines[7]))

doctest.testmod()

当我运行它时,我希望它能够通过所有测试,但是会产生以下输出:

e/lab4/Q9# python3 solution.py
**********************************************************************
File "solution.py", line 2, in __main__
Failed example:
    ip_tuple = process("2       1.001451000     192.168.0.24            10.0.0.5                98      84
                                              1")
Exception raised:
    Traceback (most recent call last):
      File "/usr/lib/python3.6/doctest.py", line 1330, in __run
        compileflags, 1), test.globs)
      File "<doctest __main__[0]>", line 1, in <module>
        ip_tuple = process("2       1.001451000     192.168.0.24            10.0.0.5                98      84
                                                  1")
      File "solution.py", line 8, in process
        return (list_lines[2], int(list_lines[7]))
    IndexError: list index out of range
**********************************************************************
1 items had failures:
   1 of   1 in __main__
***Test Failed*** 1 failures.

奇怪的是,我摆脱了文档字符串并在测试中运行了相同的代码,生成了以下文件:

def process(line):
    list_lines = line.split('\t')
    return (list_lines[2], int(list_lines[7]))

ip_tuple = process("2\t1.001451000\t192.168.0.24\t\t10.0.0.5\t\t98\t84\t\t\t\t\t\t\t\t1")
print(ip_tuple)

不产生错误,并输出以下输出:

('192.168.0.24', 84)

请说明为什么会这样。

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

docstring提供了原始字符串,因此所有的\t都被当作转义的\\t,因此,实际上,split('\t')并没有像您期望的那样正常工作。

也可以通过在文档字符串中添加调试打印来确认:

"""
>>> test_string = "2\t1.001451000\t192.168.0.24\t\t10.0.0.5\t\t98\t84\t\t\t\t\t\t\t\t1"
>>> print(test_string.split('\t'))
"""

输出

['2', ' 1.001451000     192.168.0.24', '     10.0.0.5', '', '  98      84', '', '', '', '', '', '', '', '      1']

转义文档字符串中的\t

import doctest

def process(line):
    """
    >>> ip_tuple = process("2\\t1.001451000\\t192.168.0.24\\t\\t10.0.0.5\\t\\t98\\t84\\t\\t\\t\\t\\t\\t\\t\\t1")
    """
    list_lines = line.split('\t')
    return (list_lines[2], int(list_lines[7]))


doctest.testmod()

顺利通过。

编辑

使整个文档字符串为原始字符串也可以解决此问题。

import doctest

def process(line):
#   V note the r for raw string
    r"""
    >>> ip_tuple = process("2\t1.001451000\t192.168.0.24\t\t10.0.0.5\t\t98\t84\t\t\t\t\t\t\t\t1")
    """
    list_lines = line.split('\t')
    return (list_lines[2], int(list_lines[7]))

doctest.testmod()

顺利通过。

© www.soinside.com 2019 - 2024. All rights reserved.