为了更好地解释,请考虑这个简单类型检查器函数:
从集合导入Iterable
def类型检查(obj):
返回not isinstance(obj,str)和isinstance(obj,Iterable)
如果obj不是str的可编辑类型,则返回True。但是,如果obj是str或非iterable类型,则返回False
有没有办法更有效地执行类型检查?我的意思是,一次检查obj的类型,看看它是否是str,然后再次检查,看看它是否合适,这似乎有点多余
除了str之外,我还考虑列出其他所有的iterable类型,如下所示:
返回isinstance(对象(列表、元组、dict等))
但问题是,这种方法将错过任何其他未明确列出的iterable类型
那么…有没有更好的方法,或者我在函数中给出的方法是最有效的
在Python2.x中,检查\uuuu iter\uuuu属性是有帮助的(尽管并不总是明智的),因为iterables应该有这个属性,但字符串没有
定义类型检查(obj):返回hasattr
不利的一面是,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu iter\uuuuuuuuuu并不是一种真正的python方式:例如,一些对象可能实现\uuuuuuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
在Python3.x中,字符串获得了\uuuu iter\uuuu属性,打破了此方法
您列出的方法是我在Python 3.x中所知道的最有效的真正的Python方法:
定义类型检查(obj):返回not isinstance(obj,str)和isinstance(obj,Iterable)
有一种更快(更有效)的方法,那就是像Python2.x中一样检查\uuuuu iter\uuuuu,然后检查str
def typecheck(obj):返回hasattr(obj,''.'iter'),而不是isinstance(obj,str)
这与Python2.x中的警告相同,但速度要快得多