是否有一个“列表式”对象的官方或常识标准最小接口?

我不断地看到像这样的函数和文档(这里仅举几个例子) ,它们在类列表对象上运行或引用。

我很清楚究竟是什么实际列表( dir(list) ),并且可以推断列表中的( 经常变化的 )方法在大多数对“列表类对象”的引用中是必要的,但是次数我看到它引用留给我以下问题:

是否有一个“列表式”对象的官方或常识标准最小接口? 是否像实现__getitem__一样简单,还是同意像__len____setitem__这样的额外的东西也是必需的?

这可能看起来像语义,但我不禁想到,如果不存在标准的最小接口要求, “列表式”的各种想法可能会导致一些问题/不适当的处理。 也许这只是Python的鸭子打字的一个轻微的缺点?

请参阅collections.abc模块。 在列出的抽象基类list ,Python中的list实现了IterableContainerSizedSequenceMutableSequence 。 现在,其中, IterableSequenceMutableSequence可以随便称为列表状

但是,我会理解术语列表意味着它是MutableSequence – 至less具有__getitem__ MutableSequence__len__ ,期望它也具有文档中提到的mixin方法,例如append

如果不需要__setitem____delitem__它应该被称为一个序列 – 假设是如果某个东西接受一个序列,它不需要是可变的,因此strbytestuple等也在那里工作。


您的两个链接突出了术语的模糊性:

情节化的API要求list-like对象将被内部的PlotlyJSONEncoder序列化为JSON数组,这些PlotlyJSONEncoder将大部分编码委托给Python JSONEncoder 。 然而,后者仅将tuplelist (和子类)编码到JSON数组; 因此这里的list意味着listtuple或其子类。 不是任何一个子类的自定义序列对象都会导致TypeError: [...] is not JSON serializable

链接到的解压缩配方需要一个像Sequence一样的对象(不需要可变性),因此tuplestr或实现Sequence任何自定义对象都将在那里执行。


TL; DR 列表式是一个模糊的术语。 最好使用iterable,sequence和mutable这两个术语,因为这些都是在collections.abc中定义的。

“列表式对象”的技术术语是序列 。 至less它支持sorting(即两个元素具有相同的元素,但顺序不同),索引( foo[bar]使得bar是一个小于序列长度的整数)和包含检查( in ) ,并有一个给定的长度。 它应该支持迭代,但是如果没有,那么Python将使用索引来模拟它。

几乎任何时候,如果你在Python文档中看到“类似对象”,作者就会故意模糊。 作者已经决定枚举所有需要的接口将是太麻烦了,只是说它的一些接口是必需的。 一个实现所有接口的对象可以保证工作,但是在大多数情况下,它可以处理一个实现更less的对象。

对于一个“类似列表的对象”来说,可能最好的做法是检查源代码,但是要推断它是否需要任何可变接口。 如果只需要对列表进行只读访问,则可以确定不需要执行任何可变顺序操作。

如果它说“列表式对象或迭代器”,你可以提供一些实现更简单的迭代器接口。