"""
>>> 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)
请说明为什么会这样。
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()
顺利通过。