Сначала я хочу уточнить, я НЕ спрашиваю, что такое «итератор».Что означает «итерируемый» в Python?
Это как термин «итератор» определяется в doc Пайтона:
итерацию
Объект может возвращать своим членам по одному. Примеры итераций включают в себя все типы последовательностей (такие как list, str, и кортеж) и некоторые типы без последовательности, такие как dict, файловые объекты и объекты любых классов, которые вы определяете с помощью __iter __() или __getitem __() способ. Итераторы могут использоваться в цикле for и во многих других местах , где необходима последовательность (zip(), map(), ...). Когда объект iterable передается как аргумент встроенной функции iter(), он возвращает итератор для объекта. Этот итератор хорош за один проход по множеству значений. При использовании итераций обычно не требуется для вызова iter() или для работы с объектами итератора. Оператор для этого делает это автоматически для вас, создавая временную переменную без названия, чтобы удерживать итератор в течение всего цикла. См. Также итератор, последовательность и генератор.
Как other people suggested, используя isinstance(e, collections.Iterable)
самый вещий способ проверить, является ли объект итерации.
Так что я сделал некоторые испытания с Python 3.4.3:
from collections.abc import Iterable
class MyTrain:
def __getitem__(self, index):
if index > 3:
raise IndexError("that's enough!")
return index
for name in MyTrain():
print(name) # 0, 1, 2, 3
print(isinstance(MyTrain(), Iterable)) # False
Результат довольно странно: MyTrain
определил __getitem__
метод, но он не рассматривается в качестве итератора объекта, не говоря уже, что он способен вернуть одно число за раз.
Затем я удалил __getitem__
и добавил __iter__
метод:
from collections.abc import Iterable
class MyTrain:
def __iter__(self):
print("__iter__ called")
pass
print(isinstance(MyTrain(), Iterable)) # True
for name in MyTrain():
print(name) # TypeError: iter() returned non-iterator of type 'NoneType'
Сейчас рассматриваются как «истинный» итерация объект, несмотря на это ничего не может во время прохода производства.
Так что я что-то неправильно понял или неверно?
'isinstance' не будет проверять, что интерфейс правильно реализован, что не получает узнал, пока вы на самом деле не попробовать перебрать его, только что соответствующий метод (ы) (в данном случае [только' __iter__' ] (https://docs.python.org/2/library/collections.html#collections.Iterable)). – jonrsharpe
https://docs.python.org/3/library/collections.abc.html#collections.abc.Iterable –
* ", используя' isinstance (е, collections.Iterable) 'самый вещий способ проверить, если объект iserable "* - нет, я бы сказал, что ** пытается перебрать его ** - это самый Pythonic путь! – jonrsharpe