【问题标题】:python3 code not produces error in doctest but working when run without using doctestpython3代码不会在doctest中产生错误,但在不使用doctest的情况下运行时可以工作
【发布时间】:2019-12-31 12:45:23
【问题描述】:
"""
>>> 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】:

    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()
    

    顺利通过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      相关资源
      最近更新 更多