我一直看到this和this (仅举几例)等功能和文档,这些功能和文档操作或引用类似列表的对象
我非常清楚实际列表究竟是什么(dir(list)
),并且可以在大多数引用中推断列表中的(经常变化的)方法是必要的。列表式对象“,但是我看到它引用的次数给我留下了以下问题:
是否有“类似列表”对象的官方或常识标准最小接口?是否像实现__getitem__
一样简单,或是否同意__len__
之类的其他内容还需要{1}}和__setitem__
?
这可能看起来像语义,但我不禁想到,如果没有标准的最小接口要求,“list-likeness”的各种想法可能会导致一些问题/不当处理。也许这只是Python的鸭子打字的一个小小的缺点?
答案 0 :(得分:42)
请参阅collections.abc
模块。在那里列出的抽象基类中,Python中的list
实现了Iterable
,Container
,Sized
,Sequence
和MutableSequence
。现在,Iterable
,Sequence
和MutableSequence
可以随便称为 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-like
和JSONEncoder
(和子类)编码为JSON数组;因此, list-like 在这里表示tuple
,list
或其子类。不是任何子类的自定义序列对象将导致list
。
您链接到的Sequence
需要一个行为类似{{3}}的对象,(不需要可变性),因此tuple
或TypeError: [...] is not JSON serializable
或任何自定义对象实施tuple
即可。
TL; DR 类似列表是一个模糊的术语。现在,最好使用术语iterable,sequence和mutable序列,因为它们是在str
中定义的。
答案 1 :(得分:10)
“类似列表的对象”的技术术语是序列。至少它支持排序(即具有相同元素但不同顺序的两个对象不相等),索引(foo[bar]
使得bar
是小于序列长度的整数),以及包含检查(in
),并具有给定的长度。 应该支持迭代,但如果没有,那么Python将使用索引来模拟它。
答案 2 :(得分:8)
几乎每当你看到" -like object"在Python文档中,作者故意模糊不清。作者已经决定枚举所有必需的接口会很麻烦,并且只是说它的某些接口是必需的。实现所有接口的对象保证可以工作,但在大多数情况下,它将使用实现更少的对象。
使用"类似列表的对象"除了检查源代码之外,你可以做的最好的事情就是推断它是否需要任何可变接口。如果它只需要对列表进行只读访问,那么您可以非常确定不需要实现任何可变序列操作。
如果它说"类似列表的对象或迭代器"你可以提供一些实现更简单的迭代器接口的东西。