Thread.sleep против таймеров

Вместо проверки атрибута __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 на объекте.)

-8
задан DanjahSoft Programmer 24 August 2015 в 18:26
поделиться