В Python 2.6 или выше, встроенная идиома для таких поведенческих проверок - это «проверка членства» с абстрактным базовым классом в модуле collections
стандартной библиотеки:
>>> import collections
>>> isinstance('ciao', collections.Iterable)
True
>>> isinstance(23, collections.Iterable)
False
>>> isinstance(xrange(23), collections.Iterable)
True
Действительно, этот вид проверок является основной причиной проектирования новых абстрактных базовых классов (второй важный момент заключается в предоставлении «смешанной функциональности» в некоторых случаях, именно поэтому они представляют собой ABC, а не просто интерфейсы - но это не относится к collections.Iterable
, оно существует строго , чтобы разрешить такие проверки с isinstance
или issubclass
). ABC позволяют классам, которые фактически не наследуются от них, в любом случае «регистрироваться» как подклассы, так что такие классы могут быть «подклассами» ABC для таких проверок; и они могут выполнить все необходимые проверки для специальных методов (в данном случае __iter__
), поэтому вам не нужно.
Если вы застряли в старых версиях Python, «лучше попросить прощения, чем разрешения»:
def isiterable(x):
try: iter(x)
except TypeError: return False
else: return True
но это не так быстро и лаконично, как новый подход.
Обратите внимание, что для этого особого случая вам часто понадобятся строки особого случая (которые являются итеративными, но большинство контекстов приложения в любом случае хотят рассматривать как "скаляры"). Какой бы подход вы ни использовали для проверки итеративности, если вам нужен такой специальный регистр, просто добавьте проверку для isinstance(x, basestring)
- например:
def reallyiterable(x):
return not isinstance(x, basestring) and isinstance(x, collections.Iterable)
Редактировать : как указано в комментарии, вопрос сосредоточен на том, является ли объект итерацией *** ator ***, а не тем, является ли он *** способным *** (все итераторы) итерируемы, но не наоборот - не все итерируемые являются итераторами). isinstance(x, collections.Iterator)
- это совершенно аналогичный способ проверки именно этого условия.