Как определить, является ли объект последовательностью - PullRequest
2 голосов
/ 24 ноября 2010

Я могу придумать два способа определить, является ли объект последовательностью:

  • hasattr(object, '__iter__').
  • И поднимает ли iter(object) TypeError.

Так как просить прощения больше всего Pythonic, чем спрашивать разрешения , я бы использовал вторую идиому, хотя я считаю ее более уродливой (дополнительно, когда вы вызываете исключение *

обнаружил, что объект не является последовательностью, что приведет к нежелательной трассировке стека "с двойным исключением". *1019*

В конечном счете, проверка того, что объект определяет метод __iter__, достаточно исчерпывающий, чтобы определить, является ли объект последовательностью? (Например, в более старых версиях Python str не определял метод __iter__; я также слышал, что некоторые объекты также могут просто определять и использовать __getitem__ без определения __iter__ и действовать как последовательность.) Или определяет __iter__ контракт последовательности?

1 Ответ

4 голосов
/ 24 ноября 2010

Используйте isinstance(obj, collections.Sequence). Абстрактные базовые классы как раз для этого.Они не существовали до 2.6, хотя.Если вы вынуждены использовать более старые версии, вам не повезло, и вам лучше придерживаться EAFP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...