Я могу придумать два способа определить, является ли объект последовательностью:
hasattr(object, '__iter__')
.
- И поднимает ли
iter(object)
TypeError
.
Так как просить прощения больше всего Pythonic, чем спрашивать разрешения , я бы использовал вторую идиому, хотя я считаю ее более уродливой (дополнительно, когда вы вызываете исключение *
обнаружил, что объект не является последовательностью, что приведет к нежелательной трассировке стека "с двойным исключением". *1019*
В конечном счете, проверка того, что объект определяет метод __iter__
, достаточно исчерпывающий, чтобы определить, является ли объект последовательностью? (Например, в более старых версиях Python str
не определял метод __iter__
; я также слышал, что некоторые объекты также могут просто определять и использовать __getitem__
без определения __iter__
и действовать как последовательность.) Или определяет __iter__
контракт последовательности?