如何在python中检查可迭代的isinstance? [复制]

Posted

技术标签:

【中文标题】如何在python中检查可迭代的isinstance? [复制]【英文标题】:how to check isinstance of iterable in python? [duplicate] 【发布时间】:2013-11-24 00:28:29 【问题描述】:

考虑一下这个例子吗?

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

【问题讨论】:

最简单的方法就是尝试迭代它并在它不起作用时捕获异常。 【参考方案1】:

您可以检查对象中是否有__iter__ 属性,以确保它是否可迭代。

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

注意:尽管字符串是可迭代的,但在 python 2 中它们没有__iter__,但在 python 3 中它们有它。因此,在 python 2 中,您可能还想拥有or isinstance(f, str)

【讨论】:

这对于可迭代但没有__iter__的字符串失败。 @Mark 我认为他们有。 >>> str.__iter__ <slot wrapper '__iter__' of 'str' objects> @MarkReed 我为字符串部分添加了注释。 @aIKid 在 python 3 中,我们有但没有它 python 2【参考方案2】:

您可以尝试使用collections 模块中的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

【讨论】:

collections 导入Iterable 已被弃用,将在Python 3.8+ 中中断。相反,从collections.abc 导入,例如from collections.abc import Iterable. 如果您希望在 Python 3.8 或更早版本中使用collections.abc.Iterable 作为泛型类型(例如Iterable[int]),您还必须使用from __future__ import annotations @BallpointBen 我认为您将collections.abc.Iterabletyping.Iterable 混淆了。 @cz Python 这些天变化太快了...看看Pep 585,它说从typing 导入存在于collections.abc 中的类型已被弃用;从collections.abc 导入它们是在 Python 3.9+ 和 Python 3.7+ 中使用 from __future__ import annotations 的正确方法。

以上是关于如何在python中检查可迭代的isinstance? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何判断一个对象是可迭代对象

如何在python中检查可迭代的isinstance? [复制]

迭代器

python 检查项是否可迭代并迭代它。非常适合嵌套列表,在那里你不确定那里有多少个'级别'的嵌套列表

在 Python 中,如何确定对象是不是可迭代?

python_如何在一个for循环中迭代多个可迭代对象?