You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:42:03