有没有像isiterable这样的方法?到目前为止,我找到的唯一解决办法就是打电话
hasattr(myObj, '__iter__')
但我不确定这是否万无一失。
有没有像isiterable这样的方法?到目前为止,我找到的唯一解决办法就是打电话
hasattr(myObj, '__iter__')
但我不确定这是否万无一失。
当前回答
有点晚了,但我问了自己这个问题,然后想到了一个答案。我不知道是不是有人发了这个。但本质上,我注意到所有可迭代类型的字典中都有__getitem__()。这是你不用尝试就能检查对象是否为可迭代对象的方法。(一语双关)
def is_attr(arg):
return '__getitem__' in dir(arg)
其他回答
try:
#treat object as iterable
except TypeError, e:
#object is not actually iterable
不要检查你的鸭子是否真的是一只鸭子,看看它是否可迭代,就像它是可迭代的一样对待它,如果不是就抱怨。
不是真的“正确”,但可以作为最常见的类型,如字符串,元组,浮动等快速检查…
>>> '__iter__' in dir('sds')
True
>>> '__iter__' in dir(56)
False
>>> '__iter__' in dir([5,6,9,8])
True
>>> '__iter__' in dir({'jh':'ff'})
True
>>> '__iter__' in dir({'jh'})
True
>>> '__iter__' in dir(56.9865)
False
这是不够的:__iter__返回的对象必须实现迭代协议(即next方法)。请参阅文档中的相关部分。
在Python中,一个好的实践是“尝试并查看”而不是“检查”。
有点晚了,但我问了自己这个问题,然后想到了一个答案。我不知道是不是有人发了这个。但本质上,我注意到所有可迭代类型的字典中都有__getitem__()。这是你不用尝试就能检查对象是否为可迭代对象的方法。(一语双关)
def is_attr(arg):
return '__getitem__' in dir(arg)
在我的代码中,我用来检查非可迭代对象:
hasattr (myobject, __trunc__’)
这非常快,也可以用来检查可迭代对象(使用not)。
我不是100%确定这个解决方案是否适用于所有对象,也许其他可以提供一些更多的背景。__trunc__方法与数值类型相关(所有可以舍入为整数的对象都需要它)。但是我没有发现任何包含__trunc__和__iter__或__getitem__的对象。