Python中bytearray赋值时IDE类型警告:int为何不满足SupportsIndex?
关于bytearray索引类型警告的问题解析
问题代码
def readinto(self, b: bytearray) -> int: n, size = 0, len(b) while n < size: try: b[n] = next(self._it) except StopIteration: break n += 1 return n
IDE警告信息
Unexpected type(s): (int, bytes) Possible type(s): (SupportsIndex, SupportsIndex) (slice, Iterable[SupportsIndex] | bytes)
用户疑问
我十分困惑:为何bytearray对象b的索引需要是SupportsIndex类型?普通的int类型存在什么问题?
问题解析与解决
首先明确:int类型本身就是SupportsIndex协议的实现类,你的索引n的类型完全没问题,IDE警告的核心是赋值内容的类型错误。
看警告里的(int, bytes),第一个int指的是索引n的类型(合法),第二个bytes是next(self._it)的返回类型——bytearray的单个元素只能接受0-255的整数(单字节对应的数值),如果self._it迭代出来的是bytes对象(哪怕是长度为1的bytes),就会触发这个类型不匹配的警告。
举个实际例子:如果self._it是iter(b'hello'),每次next()得到的是类似b'h'的bytes对象,直接给b[n]赋值就会报错;但如果self._it是iter(range(104, 109))(对应h到l的ASCII值),next()返回的是int,赋值就完全正常。
解决方法很直接:把迭代出来的内容转成int类型再赋值,修改后的代码如下:
def readinto(self, b: bytearray) -> int: n, size = 0, len(b) while n < size: try: b[n] = int(next(self._it)) except StopIteration: break n += 1 return n
内容的提问来源于stack exchange,提问作者songofhawk
相关产品推荐
相关产品推荐

