Python:检查对象是否不是“数组类型”

时间:2011-08-28 13:58:19

标签: python arrays list iterable

我正在寻找一种测试对象是否不属于“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

2 个答案:

答案 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')

如果是特殊情况字符串,您将:

  1. 以最自然的方式传递一组字符,打破使用函数的能力。
  2. 为用户定义的字符串类型和/或其他string-ish容器创建不一致性(例如array.array可以表示一大块数据,就像字符串一样)。
  3. 一个字符串可以用来表示单个文本和一个字符集合,因为第二个字符串也是list-ish。