如何检查python中iterable的isinstance?

如何检查python中iterable的isinstance?,python,iterable,isinstance,Python,Iterable,Isinstance,考虑一下这个例子 p = [1,2,3,4], (1,2,3), set([1,2,3])] 而不是检查每种类型,如 for x in p: if isinstance(x, list): xxxxx elif isinstance(x, tuple): xxxxxx elif isinstance(x, set): xxxxxxx 以下方面是否有一些等价物: for element in something: if isinstan

考虑一下这个例子

p = [1,2,3,4], (1,2,3), set([1,2,3])]
而不是检查每种类型,如

for x in p:
   if isinstance(x, list):
      xxxxx
   elif isinstance(x, tuple):
      xxxxxx
   elif isinstance(x, set):
      xxxxxxx
以下方面是否有一些等价物:

for element in something:
  if isinstance(x, iterable):
      do something

您可以检查对象中是否包含
\uuuuuuuuuuuuuuuuuuuuu
属性,以确保其是否可编辑

a = [1, 2, 3]
b = {1, 2, 3}
c = (1, 2, 3)
d = {"a": 1}
f = "Welcome"
e = 1
print (hasattr(a, "__iter__"))
print (hasattr(b, "__iter__"))
print (hasattr(c, "__iter__"))
print (hasattr(d, "__iter__"))
print (hasattr(f, "__iter__") or isinstance(f, str))
print (hasattr(e, "__iter__"))
输出

True
True
True
True
True
False

注意:即使字符串是可写的,在Python2中它们没有
\uuu iter\uuu
,但在Python3中它们有它。因此,在python 2中,您可能还需要
或isinstance(f,str)

您可以尝试使用
集合
模块中的
Iterable
ABC:

In [1]: import collections

In [2]: p = [[1,2,3,4], (1,2,3), set([1,2,3]), 'things', 123]

In [3]: for item in p:
   ...:     print isinstance(item, collections.Iterable)
   ...:     
True
True
True
True
False

最简单的方法就是尝试对它进行迭代,如果它不起作用,则捕获异常。对于字符串,这将失败,因为字符串是可编辑的,但没有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
@Mark,我想它们,我们有,但没有。python 2从
集合导入
Iterable
已被弃用,将在python 3.8+中崩溃。相反,请从
collections.abc
导入,例如从collections.abc导入Iterable
。如果希望在Python 3.8或更早版本中将
collections.abc.Iterable
用作泛型类型(例如
Iterable[int]
),您还必须从uuu future uuuu导入注释
@BallpointBen执行
操作。我认为您将
collections.abc.Iterable
键入混淆在一起。Iterable
@cz Python这些天变化太快了。。。看看,它说导入
集合中存在的类型;在Python3.9+和Python3.7+中,从未来导入注释是正确的方法。