类型检查:不是字符串的iterable类型

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

从集合导入Iterable
def类型检查(obj):
返回not isinstance(obj,str)和isinstance(obj,Iterable)

如果obj不是str的可编辑类型,则返回True。但是,如果objstr或非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中的警告相同,但速度要快得多

发表评论