为了更好地解释,请考虑这个简单的类型检查函数:
from collections import Iterable
def typecheck(obj):
return not isinstance(obj, str) and isinstance(obj, Iterable)
如果obj
是str
以外的可迭代类型,则返回True
。但是,如果obj
是str
或非可迭代类型,则会返回False
。
有没有办法更有效地执行类型检查?我的意思是,检查obj
的类型一次,看它是不是str
,然后再次检查 以查看它是否可迭代似乎有点多余。 / p>
我考虑列出str
之外的所有其他可迭代类型,如下所示:
return isinstance(obj, (list, tuple, dict,...))
但问题是该方法将错过任何未明确列出的其他可迭代类型。
所以...有什么更好的,或者我在函数中给出的方法效率最高?
答案 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