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 次测试通过
实际行为: ValueError
从 doctest.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()
import hashlib
def my_function(bytes_):
"""
>>> my_function(b'[=10=]')
'6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d'
"""
return hashlib.sha256(bytes_).hexdigest()
if __name__ == "__main__":
import doctest
doctest.testmod()
预期行为: 1 次测试通过
实际行为: ValueError
从 doctest.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()