在 Python 中,如何确定可迭代对象是否具有稳定的迭代顺序?
有collections.Iterable
抽象基类,但没有稳定的对应物。
我问的原因是能够阻止用户或警告他们,当他们(错误地)以不稳定的迭代顺序(dict
,set
等)迭代到迭代稳定性至关重要的函数时。
在 Python 中,如何确定可迭代对象是否具有稳定的迭代顺序?
有collections.Iterable
抽象基类,但没有稳定的对应物。
我问的原因是能够阻止用户或警告他们,当他们(错误地)以不稳定的迭代顺序(dict
,set
等)迭代到迭代稳定性至关重要的函数时。
您可能正在寻找的一件事是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]
无需声明它们是否稳定就可以编写迭代器这一事实,再加上无法通过迭代某事物来判断它以后是否会以相同的方式迭代,这意味着不可能有判断给定迭代器是否稳定的方法。
我建议您简单地记录您的函数需要迭代顺序的稳定性。您还可以显式检查您知道可能不稳定的内置类型,并在这些类型上引发错误。但是一般没有办法检查任意用户定义的迭代器的稳定性。