对于"类似列表"的对象,是否有官方或通用知识标准的最小接口?

Hav*_*eat 43 python list

我一直看到的功能和文档像这样这个 (仅举几例),该操作或请参阅列表类似的对象.

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

对于"类似列表"的对象,是否有官方或通用知识标准的最小接口? 它是那样简单actualizing __getitem__呢,还是认为像其他注意事项__len____setitem__要求呢?

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

Ant*_*ala 42

查看collections.abc模块.列出,抽象基类list在Python工具Iterable,Container,Sized,SequenceMutableSequence.现在,这些,Iterable,SequenceMutableSequence可以随便叫列表类似.

不过,我想知道,这个术语列表类似的意思,这是一个MutableSequence-至少具有方法__getitem__,__setitem__,__delitem__并且__len__,也期待它有文档中提到的混合料搅拌的方法,如append.

如果没有必要__setitem____delitem__它应该被称为一个序列,而不是-的假设是,如果事情接受序列,它并不需要是可变的,因此str,bytes,tuple等也那里工作.


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

绘图API要求list-like对象将被内部序列化为JSON数组,该内部PlotlyJSONEncoder将大部分编码委托给Python JSONEncoder.但是,后者只编码tuplelist(和子类)到JSON数组; 因此,这里的列表意味着它们的a list,a tuple或子类.将导致不是任何一个子类的自定义序列对象TypeError: [...] is not JSON serializable.

您链接到的解压缩配方需要一个行为类似于Sequence(可变性不是必需的)的对象,因此实现tuple或将执行str任何自定义对象Sequence.


TL; DR 列表是一个含糊的术语.现在,最好使用术语可迭代,序列和可变序列,现在它们被定义collections.abc.

  • 甚至更好的是调用Iterable,Sequence,MutableSequence或list这些东西,而不是像*list-like那样含糊不清的东西* (2认同)

Ign*_*ams 10

"类似列表的对象"的技术术语是序列.它至少支持排序(即具有相同元素但不同顺序的两个对象不相等),索引(foo[bar]bar是一个小于序列长度的整数),以及包含检查(in),并且具有给定长度.它应该支持迭代,但如果没有,那么Python将使用索引来模拟它.

  • 我认为"可变序列"会更准确.例如,元组是一个序列,但它不像列表那样支持项目赋值(`__setitem__`).如果记录一个函数来获取类似列表的对象,那么它很可能会改变该对象. (5认同)
  • python数据模型非常明确地指出列表是可变序列.任何指定类似列表的API几乎肯定会期望可变性,否则它会(或者至少应该)使用不同的术语.用作输入和输出的参数的优缺点实际上不是python数据模型范围的一部分.此外,API可能会指定它*return*类似于列表,在这种情况下,关于修改输入的观点是没有意义的. (4认同)
  • @iCodez:我们同意不同意.我个人认为修改可变参数是病态行为,因为当然不能保证(除了文档之外)该参数首先是可变的. (2认同)
  • @aruisdante如果您对这些声明有引用,则应将其作为答案发布. (2认同)

Ros*_*dge 8

几乎每当你在Python文档中看到"类似对象"时,作者都是故意模糊的.作者已经决定枚举所有必需的接口会很麻烦,并且只是说它的某些接口是必需的.实现所有接口的对象保证可以工作,但在大多数情况下,它将使用实现更少的对象.

使用"类似列表的对象"可能是您可以做的最好的事情,而不是检查源代码,是推断它是否需要任何可变接口.如果它只需要对列表进行只读访问,那么您可以非常确定不需要实现任何可变序列操作.

如果它说"list-like object or iterator",你可以提供一些实现更简单的迭代器接口的东西.