python - 如何知道Python类型是否有顺序的概念?序列到底是什么?

标签 python types sequences

Python 中的 OrderedDict 不是序列类型,这让我有点惊讶。它有一个顺序的概念,但它不是一个序列。

Python docs

There are seven sequence types: strings, Unicode strings, lists, tuples, bytearrays, buffers, and xrange objects.

For other containers see the built in dict and set classes, and the collections module. ...Most sequence types support the following operations....Sequence types also support comparisons.

这些操作对应于__contains____add__(用于连接)、__getitem__(在range(len(foo))中))、__len____min____slice__indexcount__lt__ 等实现比较。

OrderedDicts 实现了其中一些方法,但没有实现其他方法,可能是因为通过键(如字典)或顺序(如索引)访问项目的语法糖是相同的。

我知道如果有东西实现了 __iter__ 我可以循环遍历它。我怎样才能确切地知道某样东西是否有订单?我本以为这就是“序列”的含义,第 n 项始终是第 n 项。

最佳答案

在鸭子打字世界中,这是一个困难的问题。

两者sequences and mapping使用__getitem__()分别使用内部索引和键来访问项目。寻找 __getitem__() 的可用性方法并不能区分它们,您需要查看该方法实际上做了什么。

对于字典,不可能知道整数参数是否为 __getitem__()是索引或键,因此它始终以映射方式工作。

因此,我认为字典根本不是序列,尽管它支持迭代。这同样适用于集合。

查看 collections.abc.Sequence基类可能是最好的测试。对于自定义类型,只需确保它们是从该基类派生的即可。

关于python - 如何知道Python类型是否有顺序的概念?序列到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17521557/

相关文章:

C++ 指向对象类型检查的指针

c++ - 如何从基类 vector 获取派生类的名称

r - R 中 arules 的序列事务类

python - scikit learn 是否包含具有连续输入的朴素贝叶斯分类器?

c - 如何删除 char 数组转换为无符号 char 数组的警告

c++ - 我需要一个更好的算法来解决这个问题

r - 在随时间重复的连续数据中创建唯一的组

python - 可选择将参数传递给 python 中的子进程

python - 从 zip 中提取某些文件但不是完整的目录

python - 如何从 python 中的 wav 文件中删除静音期?