ValueError: source code string cannot contain null bytes

ValueError: source code string cannot contain null bytes

import hashlib


def my_function(bytes_):
    """
    >>> my_function(b'[=10=]')
    '6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d'
    """
    return hashlib.sha256(bytes_).hexdigest()


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

预期行为: 1 次测试通过

实际行为: ValueErrordoctest.py.

中引发异常

我也尝试过使用 b'\x00' 字面值,但结果相同。如何在 doctest 中使用空字节?这里的问题到底是什么,是否有任何修复或不太难看的解决方法?

当您希望字符串包含反斜杠时,您需要使用另一个反斜杠对其进行转义。否则,它试图转义后面的字符。

在您的情况下,b'[=11=]' 会将 [=12=] 替换为空字符,因此您的错误。 改为尝试:

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

您的 doctest 正在被双重解析。首先,Python 应用反斜杠处理将 [=11=] 转换为文档字符串本身中的空字节,然后 doctest 尝试 运行 >>> 之后的内容作为Python 代码并遇到错误,因为已经应用了反斜杠处理。

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

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

def my_function(bytes_):
    r"""
    >>> my_function(b'[=10=]')
    '6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d'
    """
    return hashlib.sha256(bytes_).hexdigest()