如何在Python doctest中使用bytearray编写测试用例?
解决doctest中传入含空字节的bytes/bytearray参数报错问题
问题场景
定义了如下函数:
def fun12(bytes_var: bytearray, signed: bool) -> int: # 函数实现逻辑
直接执行print(fun12(b'\x00\x10', False))时代码运行正常,但在doctest注释中编写测试用例:
>>> fun12(b'\x00\x10',False) 16
却触发报错,错误信息如下:
Failed example:
fun12(b'\x00\x10',False)
Exception raised:
Traceback (most recent call last):
File "/Users/usr12/.pyenv/versions/3.10.0/lib/python3.10/doctest.py", line 1348, in __run
exec(compile(example.source, filename, "single",
ValueError: source code string cannot contain null bytes1 items had failures:
1 of 1 in main
Test Failed 1 failures.
问题根源是doctest在编译测试用例源码时,会把字节字面量里的\x00(空字节)视为无效的源码字符,导致编译失败。
可行解决方案
1. 使用十六进制字符串构造参数
通过bytes.fromhex()或bytearray.fromhex()来生成含空字节的对象,避免直接在源码中写\x00:
>>> fun12(bytearray.fromhex('0010'), False) 16
或者:
>>> fun12(bytes.fromhex('0010'), False) 16
2. 拆分拼接构造字节对象
把包含空字节的部分和其他字节分开构造后拼接,绕开直接写\x00的问题:
>>> fun12(b'\x00' + b'\x10', False) 16
不过这种方式在部分Python版本或环境中仍可能触发类似问题,优先推荐第一种方法。
内容的提问来源于stack exchange,提问作者user13387446
相关产品推荐
相关产品推荐

