如何判断一个对象是否是一个序列

Hum*_*art 4 python collections python-3.x

我可以想到两种方法来判断一个对象是否是一个序列:

  • hasattr(object, '__iter__')
  • 以及调用是否iter(object)引发TypeError.

由于请求宽恕而不是请求许可是最 Pythonic 的,所以我会使用第二个习惯用法,尽管我认为它更难看(此外,一旦捕获到TypeError确定对象不是序列,就会引发异常产生不需要的“双异常”堆栈跟踪)。

最终,检查对象是否定义了__iter__方法是否足以确定对象是否是序列?(例如,在旧版本的 Python 中,str没有定义__iter__方法;我还听说某些对象也可以简单地定义和使用,__getitem__而不需要定义__iter__and 充当序列。)或者是定义序列的__iter__ 契约?

小智 5

使用isinstance(obj, collections.Sequence)抽象基类正是用于此目的。但它们在 2.6 之前并不存在。如果您被迫使用旧版本,那么您就不走运了,最好坚持使用 EAFP。