类型检查:不是字符串的可迭代类型

时间:2013-11-13 01:42:21

标签: python python-3.x typechecking

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

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

如果objstr以外的可迭代类型,则返回True。但是,如果objstr或非可迭代类型,则会返回False

有没有办法更有效地执行类型检查?我的意思是,检查obj的类型一次,看它是不是str,然后再次检查 以查看它是否可迭代似乎有点多余。 / p>

我考虑列出str之外的所有其他可迭代类型,如下所示:

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

但问题是该方法将错过任何未明确列出的其他可迭代类型。

所以...有什么更好的,或者我在函数中给出的方法效率最高?

2 个答案:

答案 0 :(得分:14)

python 2.x 中,检查__iter__属性是有帮助的(尽管并不总是明智的),因为iterables应该具有此属性,但字符串不具有。

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)

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

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

这与Python 2.x中的注意事项相同,但速度要快得多。

答案 1 :(得分:0)

我使用此代码检查它,它适用于Python 2和3

from __future__ import unicode_literals
import types
import collections

var = ["a", "b", "c"]
if isinstance(var, collections.Iterable) and \
        not isinstance(var, types.StringTypes):
    return var