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中使用空字节?究竟是什么问题,是否有任何修复或不太丑陋的解决方法?
答案 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()