iter(x)
повысит TypeError
, если x
не может быть повторен, но эта проверка «принимает» наборы и словари, хотя она «отклоняет» другие непоследовательности, такие как None
и числа.
С другой стороны, строки (которые большинство приложений хотят рассматривать как «отдельные элементы», а не последовательности) являются фактическими последовательностями (поэтому любой тест, за исключением специального случая для строк, будет подтверждать, что они есть). Таким образом, таких простых проверок часто недостаточно.
В Python 2.6 и выше были введены абстрактные базовые классы , и среди других мощных функций они предлагают более хорошую, систематическую поддержку для такой «проверки категорий».
>>> import collections
>>> isinstance([], collections.Sequence)
True
>>> isinstance((), collections.Sequence)
True
>>> isinstance(23, collections.Sequence)
False
>>> isinstance('foo', collections.Sequence)
True
>>> isinstance({}, collections.Sequence)
False
>>> isinstance(set(), collections.Sequence)
False
Вы заметите, что строки все еще считаются "последовательностью" (поскольку они являются ), но, по крайней мере, вы получаете указания и отклонения. Если вы хотите исключить строки из вашего понятия «быть последовательностями», вы можете использовать collections.MutableSequence
(но это также исключает кортежи, которые, подобно строкам, являются последовательностями, но не являются изменяемыми), или сделать это явно:
import collections
def issequenceforme(obj):
if isinstance(obj, basestring):
return False
return isinstance(obj, collections.Sequence)
Приправить по вкусу и подавать горячим! -)