【问题标题】:Return `bytes` or `bytearray` when processing chunks of binary data?处理二进制数据块时返回“字节”或“字节数组”?
【发布时间】:2018-05-02 18:24:21
【问题描述】:

当返回/产生二进制数据块时,返回bytes 或bytearray 是否更惯用?

我的函数在bytearray 中累积数据,目前返回bytes(myarray)。是否有任何理由支持或反对返回公正 bytearray 直接?特别是,如果一个函数需要bytes 并得到bytearray,是否存在任何可能的陷阱(只要它不检查实际类型)?

根据documentation of bytearray:

它具有可变序列类型中描述的大多数常见可变序列方法,以及bytes 类型具有的大多数方法,请参阅Bytes and Byte Array Methods。

(我的重点。)这表明bytearray 可以在任何需要bytes 的地方使用。

【问题讨论】:

  • ByteArray 得到了索引,但bytes 对索引一无所知。字节数组保护所有模式免受错误编码,但不能直接使用,使用前需要翻译(平均字节(字节数组))。如此简短的描述:bytearray 是原始源,bytes 是输出。

标签: python arrays python-3.x idioms


【解决方案1】:

它们不能在所有可能的情况下互换。一些代码可能使用类型检查,它们有不同的类型。和他们的名字一样,类型是bytearray 和bytes。

问题编辑后:

唯一的区别是bytes is an immutable version of bytearray。

所以,bytearray 可以在任何需要bytes 的地方使用。

【讨论】:

  • 注意:这并不完美。某些 API 将执行 isinstance(x, bytes) 检查,但同时不允许 bytearray。不一致like this are usually considered a bug,但确实发生了。
  • @ShadowRanger 使用if isinstance(address, bytes): 将排除bytearray。那么,为什么是bytes,为什么不是bytearray?只要bytes 和bytearray 都代表一个字节字符串,这对我来说确实是一个错误。 if isinstance(address, (bytes, bytearray)): 是正确的。
  • 我指出这是一个错误,通常会在发现时得到修复。我不是想为它辩护。也就是说,即使允许bytes+bytearray 通常也不够广泛;字节宽度memoryviews、array.arrays 和mmap.mmaps 等都应该可以互换。在现代 Python 中,他们终于添加了an ABC to group these, collections.abc.ByteString,但标准库中的所有测试都需要一段时间才能可靠地使用它。
  • @ShadowRanger 我只是强调了你的观点。甚至 collections.abc.ByteString will just check 对于 bytes 和 bytearray。根据PEP3137bytes 和bytearray 具有可比性和可订购性。另外,我同意您在第二条评论中提出的观点。
  • 你是对的。虽然在collections.abc 中执行的唯一注册是针对bytes 和bytearray,并且允许并期望第三方类型在适当的时候将自己注册为ByteStrings,但大多数此类用例都存在问题,因为除了来自mmap.mmap(可以注册自己,但不会),大多数此类类型(memoryview、array.array、numpyarray 类型)太笼统,无法让它们始终适合ByteString,这就离开了手动实例检查(例如转换为memoryview 捕获TypeError,检查v.c_contiguous and v.ndim == 1 and v.format == 'B')。
猜你喜欢
  • 2011-02-04
  • 1970-01-01
  • 2015-06-15
  • 2022-12-09
  • 1970-01-01
  • 2023-03-20
  • 2012-05-08
  • 2012-10-03
  • 1970-01-01
相关资源
最近更新 更多