我可以想到两种方法来确定一个对象是否是一个序列:
hasattr(object, '__iter__')
。iter(object)
会引发TypeError
。因为请求宽恕而不是请求许可是最恐怖的,所以我会使用第二个成语,虽然我认为它更难看(另外,提出异常一旦你抓住TypeError
来确定对象不是一个序列就会产生一个不合需要的“双异常”堆栈跟踪。)
最终,检查一个对象是否定义了一个详尽的__iter__
方法,以确定一个对象是否是一个序列? (例如,在旧版本的Python中,str
没有定义__iter__
方法;我也听说过一些对象也可以简单地定义和使用__getitem__
而无需定义{ {1}}并且像序列一样行动。)或者定义__iter__
序列的合同?
答案 0 :(得分:4)
使用isinstance(obj, collections.Sequence)
。 Abstract base classes正是为了这个。但它们在2.6之前并不存在。如果您被迫使用旧版本,那么您运气不佳并且更好地坚持使用EAFP。