我正在寻找一种测试对象是否不属于“list-ish”类型的方法,即 - 不仅是对象不可迭代(例如 - 你也可以运行 iter 在一个字符串上,或在一个实现 iter 的简单对象上,但该对象不在列表系列中。我将“ list ”系列定义为list / tuple / set / frozenset,或任何继承自那些的东西,但是 - 因为可能有一些我缺少的东西,我想找到更多一般方法而不是针对所有这些类型运行isinstance
。
我想到了两种可行的方法,但两者看起来都有些尴尬,因为它们会针对每种可能的列表类型进行测试,而我正在寻找更通用的解决方案。
第一个选项:
return not isinstance( value, (frozenset, list, set, tuple,) )
第二个选项:
return not hasattr(value, '__iter__')
是否足够测试__iter__
属性?有没有更好的方法来查找对象是否不是列表类型?
提前致谢。
修改:
(引用@Rosh Oxymoron的解决方案评论):
现在考虑更好的定义,我认为我更需要在定义中找到不是数组类型的所有内容,但它仍然可以是字符串/其他简单对象...
检查对于collections.Iterable
方法,对__iter__
仍然会为我提供 True 。
答案 0 :(得分:5)
没有任何术语'list-ish',并且没有魔法内置check_if_value_is_an_instance_of_some_i_dont_know_what_set_of_types
。
使用not isinstance( value, (frozenset, list, set, tuple,) )
的解决方案非常好 - 它清晰明了。
答案 1 :(得分:2)
没有这样的家庭 - 它没有明确定义,自然也没有办法检查它。最接近的可能是一个不是字符串的iterable。您可以测试对象是否具有可迭代性,然后显式检查它是否为字符串:
if isinstance(ob, collections.Iterable) and not isinstance(ob, types.StringTypes):
print "An iterable container"
更好的方法是始终要求可迭代对象,当您需要传递单个字符串S
时,请改为传递[S]
。传递字符串的能力是一个特征,例如:
alphabet = set('abcdefgijklmopqrstuvwxyz')
如果是特殊情况字符串,您将:
array.array
可以表示一大块数据,就像字符串一样)。一个字符串可以用来表示单个文本和一个字符集合,因为第二个字符串也是list-ish。