python-“类列表”对象是否有官方或常识标准的最小接口?

我不断看到这样的功能和文档(仅举几例),这些功能和文档可操作或引用类似列表的对象。

我很清楚实际的列表是什么(__getitem__),可以从列表中推断出大多数引用“类似列表的对象”所必需的方法(通常是变化的),但是我看到它的次数 被引用给我留下了以下问题:

是否为“类列表”对象提供了官方或常识标准的最小接口? 是像实现__getitem__一样简单,还是同意还需要诸如__len____setitem__之类的其他内容?

这看起来似乎是语义,但是我不禁认为,如果不存在标准的最小接口要求,则各种“类似列表”的想法可能会引起一些问题/处理不当。 也许这只是Python的鸭子类型的一个小缺点?

HavelTheGreat asked 2020-07-31T23:49:48Z
3个解决方案
42 votes

请参阅list模块。 在此处列出的抽象基类中,Python的list实现了MutableSequence__getitem____setitem__SequenceMutableSequence。现在,其中的2991418763502945945,SequenceMutableSequence可以像清单一样随意地使用。

但是,我会理解“列表”一词的意思是说它是MutableSequence-至少具有__getitem____setitem__collections.abcstr的方法,也希望它具有文档中提到的mixin方法,例如Sequence

如果不需要collections.abcstr,则应将其称为序列-假设是,如果某物接受序列,则不需要是可变的,因此Sequencelistlist等也可以在那里工作。


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

plotly API要求将内部collections.abc(将大部分编码委托给Python str)将collections.abc对象序列化为JSON数组。但是,后者仅将Sequencelist(和子类)编码为JSON数组; 因此,此处的“列表”表示listtuple或其子类。 不是这两个子类的子类的自定义序列对象将产生TypeError: [...] is not JSON serializable

链接到的解压配方需要一个行为类似于collections.abc的对象(不需要可变性),因此collections.abcstr或实现Sequence的任何自定义对象都可以在其中执行操作。


类似TL; DR的清单是一个模糊的术语。 现在最好使用术语“可迭代”,“序列”和“可变序列”,因为它们已在collections.abc中定义。

Antti Haapala answered 2020-08-01T00:03:06Z
10 votes

“类列表对象”的技术术语是序列。 至少它支持排序(即,两个具有相同元素但不同顺序的对象不相等),索引(foo[bar],使得bar是小于序列长度的整数)以及包含检查(in),并且具有 给定的长度。 它应该支持迭代,但是如果不支持,Python将使用索引对其进行仿真。

Ignacio Vazquez-Abrams answered 2020-08-01T00:03:28Z
8 votes

几乎每当您在Python文档中看到“ -like object”时,作者就会刻意模糊。 作者认为枚举所有必需的接口会带来太多麻烦,而只是说它的某些接口是必需的。 确保实现了所有接口的对象都可以工作,但是在大多数情况下,它将与实现量少得多的对象一起工作。

对于“类似列表的对象”,可能要想做到最好,而无需检查源代码,而是推断它是否需要任何可变接口。 如果只需要对列表的只读访问权限,则可以确定不需要实现任何可变序列操作。

如果显示“类似列表的对象或迭代器”,则可以提供实现更简单的迭代器接口的内容。

Ross Ridge answered 2020-08-01T00:03:58Z
translate from https://stackoverflow.com:/questions/28841735/is-there-an-official-or-common-knowledge-standard-minimal-interface-for-a-list