是否有一个“列表式”对象的官方或常识标准最小接口?
我不断地看到像这样的函数和文档(这里仅举几个例子) ,它们在类列表对象上运行或引用。
我很清楚究竟是什么实际列表( dir(list)
),并且可以推断列表中的( 经常变化的 )方法在大多数对“列表类对象”的引用中是必要的,但是次数我看到它引用留给我以下问题:
是否有一个“列表式”对象的官方或常识标准最小接口? 是否像实现__getitem__
一样简单,还是同意像__len__
和__setitem__
这样的额外的东西也是必需的?
这可能看起来像语义,但我不禁想到,如果不存在标准的最小接口要求, “列表式”的各种想法可能会导致一些问题/不适当的处理。 也许这只是Python的鸭子打字的一个轻微的缺点?
请参阅collections.abc
模块。 在列出的抽象基类list
,Python中的list
实现了Iterable
, Container
, Sized
, Sequence
和MutableSequence
。 现在,其中, Iterable
, Sequence
和MutableSequence
可以随便称为列表状 。
但是,我会理解术语列表意味着它是MutableSequence
– 至less具有__getitem__
MutableSequence
和__len__
,期望它也具有文档中提到的mixin方法,例如append
。
如果不需要__setitem__
和__delitem__
它应该被称为一个序列 – 假设是如果某个东西接受一个序列,它不需要是可变的,因此str
, bytes
, tuple
等也在那里工作。
您的两个链接突出了术语的模糊性:
情节化的API要求list-like
对象将被内部的PlotlyJSONEncoder
序列化为JSON数组,这些PlotlyJSONEncoder
将大部分编码委托给Python JSONEncoder
。 然而,后者仅将tuple
和list
(和子类)编码到JSON数组; 因此这里的list
意味着list
, tuple
或其子类。 不是任何一个子类的自定义序列对象都会导致TypeError: [...] is not JSON serializable
。
链接到的解压缩配方需要一个像Sequence
一样的对象(不需要可变性),因此tuple
或str
或实现Sequence
任何自定义对象都将在那里执行。
TL; DR 列表式是一个模糊的术语。 最好使用iterable,sequence和mutable这两个术语,因为这些都是在collections.abc
中定义的。
“列表式对象”的技术术语是序列 。 至less它支持sorting(即两个元素具有相同的元素,但顺序不同),索引( foo[bar]
使得bar
是一个小于序列长度的整数)和包含检查( in
) ,并有一个给定的长度。 它应该支持迭代,但是如果没有,那么Python将使用索引来模拟它。
几乎任何时候,如果你在Python文档中看到“类似对象”,作者就会故意模糊。 作者已经决定枚举所有需要的接口将是太麻烦了,只是说它的一些接口是必需的。 一个实现所有接口的对象可以保证工作,但是在大多数情况下,它可以处理一个实现更less的对象。
对于一个“类似列表的对象”来说,可能最好的做法是检查源代码,但是要推断它是否需要任何可变接口。 如果只需要对列表进行只读访问,则可以确定不需要执行任何可变顺序操作。
如果它说“列表式对象或迭代器”,你可以提供一些实现更简单的迭代器接口。