我一直看到的功能和文档像这样和这个 (仅举几例),该操作或请参阅列表类似的对象.
我非常清楚实际列表是什么(dir(list)),并且可以在大多数对"类似列表的对象"的引用中推断出列表中的(通常是变化的)方法是必要的,但是我看到它引用的次数给我留下了以下问题:
对于"类似列表"的对象,是否有官方或通用知识标准的最小接口? 它是那样简单actualizing __getitem__呢,还是认为像其他注意事项__len__和__setitem__要求呢?
这可能看起来像语义,但我不禁想到,如果不存在标准的最小接口要求,"列表相似"的各种想法可能会导致一些问题/不当处理.也许这只是Python的鸭子打字的一个小小的缺点?
Ant*_*ala 42
查看collections.abc模块.列出,抽象基类list在Python工具Iterable,Container,Sized,Sequence和MutableSequence.现在,这些,Iterable,Sequence和MutableSequence可以随便叫列表类似.
不过,我想知道,这个术语列表类似的意思,这是一个MutableSequence-至少具有方法__getitem__,__setitem__,__delitem__并且__len__,也期待它有文档中提到的混合料搅拌的方法,如append.
如果没有必要__setitem__和__delitem__它应该被称为一个序列,而不是-的假设是,如果事情接受序列,它并不需要是可变的,因此str,bytes,tuple等也那里工作.
您的两个链接突出了该术语的模糊性:
绘图API要求list-like对象将被内部序列化为JSON数组,该内部PlotlyJSONEncoder将大部分编码委托给Python JSONEncoder.但是,后者只编码tuple和list(和子类)到JSON数组; 因此,这里的列表意味着它们的a list,a tuple或子类.将导致不是任何一个子类的自定义序列对象TypeError: [...] is not JSON serializable.
您链接到的解压缩配方需要一个行为类似于Sequence(可变性不是必需的)的对象,因此实现tuple或将执行str任何自定义对象Sequence.
TL; DR 列表是一个含糊的术语.现在,最好使用术语可迭代,序列和可变序列,现在它们被定义collections.abc.
Ign*_*ams 10
"类似列表的对象"的技术术语是序列.它至少支持排序(即具有相同元素但不同顺序的两个对象不相等),索引(foo[bar]这bar是一个小于序列长度的整数),以及包含检查(in),并且具有给定长度.它应该支持迭代,但如果没有,那么Python将使用索引来模拟它.
几乎每当你在Python文档中看到"类似对象"时,作者都是故意模糊的.作者已经决定枚举所有必需的接口会很麻烦,并且只是说它的某些接口是必需的.实现所有接口的对象保证可以工作,但在大多数情况下,它将使用实现更少的对象.
使用"类似列表的对象"可能是您可以做的最好的事情,而不是检查源代码,是推断它是否需要任何可变接口.如果它只需要对列表进行只读访问,那么您可以非常确定不需要实现任何可变序列操作.
如果它说"list-like object or iterator",你可以提供一些实现更简单的迭代器接口的东西.
| 归档时间: |
|
| 查看次数: |
1849 次 |
| 最近记录: |