`bytearray`不与Python的Zen相矛盾吗?

时间:2016-05-16 22:02:02

标签: python python-3.x bytearray

Python PEP 3137bytearray引入为可变的8位数组类型。但是,list类型的bytes实现了相同的目标,实际上有better performance,尽管可能是一种笨拙的语法。这种新类型与Zen of Python

相矛盾
  

应该有一个 - 最好只有一个 - 显而易见的方法。

所以我的问题是:在bytearray list bytes上使用bytearray是否有任何记录的主要优势或设计考虑因素?

到目前为止,我还没有在PEP或文档页面中找到一条动机。实际上,文档将它们视为接近等于:

  

bytearray类型是0 <= x <0的范围内的可变整数序列。它有大多数可变序列的常用方法......

然后,

  

List和bytearray对象支持允许对象进行就地修改的其他操作。其他可变序列类型(当添加到语言中时)也应该支持这些操作。

由于bytearray是静态类型的(作为8位无符号整数),人们可能会期望性能提高,但如上所述,反转可能是正确的。此外,对于list bytes itertools.chain,{{1}}应该没有内存优势。我可以想象需要一种{{1}}式的可变类型,但这在任何地方都没有提及,似乎不是设计目标。

1 个答案:

答案 0 :(得分:0)

首先,一个list样式的容器,用于可以无缝迭代它们的对象序列(实际上itertools.chain提供的东西)看起来很方便。正如PEP 3137提到的那样,array module可能已经为此目的服务,但“远非理想”。

作者希望“可变字节类型和不可变字节类型”,这可能意味着设计目标对于可变的(可能使用非连续内存进行快速插入和删除)具有相同的接口,以及作为一个不可变(绝对连续的内存)实现。据我所知,这创建了一系列混乱的序列类型,包括array.arraybytesbytearraystrunicode,{{1 },listtuple。实质上,它们为静态类型或鸭子类型,可变或不可变序列提供接口,这些序列存储在存储器中或在运行中进行评估(生成器)。其中大多数都遵循Abstract Base Classes的基本原理,但我认为在将其视为Pythonic之前还有更多的设计要做。

注意:我打开这个答案进行编辑,希望人们可以提供见解或更正。