ValueError:源代码字符串不能包含空字节

时间:2017-05-31 23:49:16

标签: python doctest

import hashlib


def my_function(bytes_):
    """
    >>> my_function(b'\0')
    '6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d'
    """
    return hashlib.sha256(bytes_).hexdigest()


if __name__ == "__main__":
    import doctest
    doctest.testmod()

预期行为: 1次测试通过

实际行为: ValueError异常是从doctest.py内引发的。

我也尝试使用b'\x00'字面值并使用相同的结果。如何在doctest中使用空字节?究竟是什么问题,是否有任何修复或不太丑陋的解决方法?

2 个答案:

答案 0 :(得分:3)

你的doctest正在进行双重解析。首先,Python应用反斜杠处理将\0转换为docstring本身的空字节,然后doctest尝试在>>>之后作为Python代码运行,并遇到错误,因为反斜杠处理已经应用。

对于只是尝试打印文档字符串或尝试在您的函数上调用help的人来说,这也是一个问题。

与正则表达式一样,要避免第一层反斜杠处理,请使用原始字符串表示法:

def my_function(bytes_):
    r"""
    >>> my_function(b'\0')
    '6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d'
    """
    return hashlib.sha256(bytes_).hexdigest()

答案 1 :(得分:0)

如果希望字符串包含反斜杠,则需要使用另一个反斜杠来转义它。否则,它试图逃避以下角色。

在您的情况下,b'\0'将使用空字符替换\0,因此您的错误。 请尝试改为:

def my_function(bytes_):
    """
    >>> my_function(b'\\0')
    '6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d'
    """
    return hashlib.sha256(bytes_).hexdigest()