你可能需要关注的一个东西是
collections.Sequence
。它比你想要的更为具体,因为根据
文档,序列“支持使用整数索引高效访问元素”;但它又不够具体,因为没有明确保证两次获取相同索引一定会返回相同的值。但这足以区分列表和元组与字典和集合。
然而,在一般情况下是没有方法的。一般情况下也不能有方法,因为你可以编写任何你喜欢的可迭代对象,并且没有要求你指定它是否稳定。例如,你可以这样做:
>>> def f():
... if random.random() < 0.5:
... for a in xrange(10):
... yield a
... else:
... stuff = range(10)
... random.shuffle(stuff)
... for a in stuff:
... yield a
>>> list(f())
0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(f())
1: [7, 0, 2, 8, 5, 1, 4, 3, 6, 9]
迭代器可以在不声明其是否稳定的情况下编写,而且通过迭代某些东西来告诉它是否会以后以相同的方式迭代是不可能的,这意味着没有办法确定给定迭代器是否稳定。
我建议您简单地记录函数需要迭代顺序的稳定性。 您还可以明确检查已知可能不稳定的内置类型,并在这些类型上引发错误。 但是,通常无法检查任意用户定义的迭代器的稳定性。