17

为了更好地解释,考虑这个简单的类型检查器函数:

from collections import Iterable
def typecheck(obj):
    return not isinstance(obj, str) and isinstance(obj, Iterable)

如果obj是除 之外的可迭代类型str,则返回True。但是,如果obj是一个str或一个不可迭代的类型,它返回False.

有什么方法可以更有效地执行类型检查?obj我的意思是,检查一次的类型以查看它是否不是 astr然后再次检查以查看它是否可迭代似乎有点多余。

我考虑过列出除此之外str的所有其他可迭代类型:

return isinstance(obj, (list, tuple, dict,...))

但问题是这种方法会遗漏任何其他未明确列出的可迭代类型。

那么......有什么更好的方法还是我在函数中给出的方法最有效?

4

1 回答 1

15

python 2.x中,检查__iter__属性是有帮助的(虽然并不总是明智的),因为可迭代对象应该有这个属性,但字符串没有。

def typecheck(obj): return hasattr(myObj, '__iter__')

不利的一面是,这__iter__不是一种真正的 Pythonic 方式:某些对象可能会实现__getitem__,但不是__iter__例如。

Python 3.x中,字符串获得了__iter__属性,打破了这种方法。

您列出的方法是我在 Python 3.x 中知道的最有效的真正 Pythonic 方法:

def typecheck(obj): return not isinstance(obj, str) and isinstance(obj, Iterable)

有一种更快(更有效)的方法,即__iter__像在 Python 2.x 中一样检查,然后检查str.

def typecheck(obj): return hasattr(obj, '__iter__') and not isinstance(obj, str)

这与 Python 2.x 中的警告相同,但要快得多。

于 2013-11-13T02:46:27.233 回答