Python 3.11+中“bytes或bytearray”的更优类型注解方式?
在Python 3.11+中,有没有更简洁的方式注解「只读有序字节集合」类型?
我有个函数仅需读取传入的有序字节数据,不会对其做修改,目前用bytes | bytearray做类型注解,但总觉得这种写法繁琐,而且为了满足类型检查去转换bytes和bytearray完全没必要。示例代码如下:
def serialize_to_stream(stream: MyStream, data: bytes | bytearray) -> None: for byte in data: stream.accumulate(byte)
想知道有没有更便捷的类型注解方式替代bytes | bytearray?
可行解决方案
1. 使用collections.abc.ByteString
Python标准库collections.abc中的ByteString抽象基类,正好对应「只读有序字节集合」的类型,它是bytes和bytearray的共同抽象父类(从类型检查逻辑出发),完美匹配你「仅读取不修改」的需求。
修改后的代码:
from collections.abc import ByteString def serialize_to_stream(stream: MyStream, data: ByteString) -> None: for byte in data: stream.accumulate(byte)
主流类型检查器(如mypy、pyright)都会识别bytes和bytearray实例可直接传入该参数,无需额外转换。
2. 自定义类型别名(追求更直观命名时)
如果你觉得ByteString的命名不够贴合业务场景,可以自行定义一个类型别名:
from collections.abc import ByteString ReadOnlyBytes = ByteString def serialize_to_stream(stream: MyStream, data: ReadOnlyBytes) -> None: for byte in data: stream.accumulate(byte)
该方案本质和第一种一致,只是给ByteString起了个更直观的别名。
方案合理性说明
ByteString定义了只读字节序列的核心操作(迭代、索引访问、长度获取等),而bytes和bytearray都实现了这些操作。由于你的函数仅做读取操作,用ByteString注解完全匹配需求,类型检查器也会认可bytes和bytearray的兼容性。
内容的提问来源于stack exchange,提问作者Charles Nicholson
相关产品推荐
相关产品推荐

