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

时间:2015-03-03 20:56:58

标签: python list

我一直看到thisthis (仅举几例)等功能和文档,这些功能和文档操作或引用类似列表的对象

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

是否有“类似列表”对象的官方或常识标准最小接口?是否像实现__getitem__一样简单,或是否同意__len__之类的其他内容还需要{1}}和__setitem__

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

3 个答案:

答案 0 :(得分:42)

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

但是,我会理解 list-like 一词意味着它是MutableSequence - 至少包含方法__getitem____setitem__,{ {1}}和__delitem__,期望它还包含文档中提到的mixin方法,例如__len__

如果不需要append__setitem__,则应将其称为序列 - 假设如果某些事物接受序列,则它不需要是可变的,因此{{1 }},__delitem__str等也可以在那里工作。


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

情节API要求bytes对象由内部PlotlyJSONEncoder序列化为JSON数组,该内部unzip recipe将大部分编码委托给Python tuple。但是,后者仅将list-likeJSONEncoder(和子类)编码为JSON数组;因此, list-like 在这里表示tuplelist或其子类。不是任何子类的自定义序列对象将导致list

您链接到的Sequence需要一个行为类似{{3}}的对象,(不需要可变性),因此tupleTypeError: [...] is not JSON serializable或任何自定义对象实施tuple即可。


TL; DR 类似列表是一个模糊的术语。现在,最好使用术语iterable,sequence和mutable序列,因为它们是在str中定义的。

答案 1 :(得分:10)

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

答案 2 :(得分:8)

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

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

如果它说"类似列表的对象或迭代器"你可以提供一些实现更简单的迭代器接口的东西。