Вместо проверки атрибута __iter__
вы можете проверить атрибут __len__
, который реализуется каждым встроенным итерабельным python, включая строки.
>>> hasattr(1, "__len__")
False
>>> hasattr(1.3, "__len__")
False
>>> hasattr("a", "__len__")
True
>>> hasattr([1,2,3], "__len__")
True
>>> hasattr({1,2}, "__len__")
True
>>> hasattr({"a":1}, "__len__")
True
>>> hasattr(("a", 1), "__len__")
True
Объекты без объектов не будут реализовывать это по очевидным причинам. Однако он не улавливает пользовательские итерации, которые не реализуют его, и не генерируют выражения генератора, с которыми iter
может справиться. Однако это можно сделать в строке, и добавление простой проверки or
выражения для генераторов устранит эту проблему. (Обратите внимание, что запись type(my_generator_expression) == generator
вызовет NameError
. Вместо этого обратитесь к этому .)
Вы можете использовать GeneratorType из типов:
>>> import types >>> types.GeneratorType
>>> gen = (i for i in range(10)) >>> isinstance(gen, types.GeneratorType) True --- принятый ответ utdemir
blockquote>(Это делает его полезным для проверки, можете ли вы называть
len
на объекте.)