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

Posted

技术标签:

【中文标题】Python:检查对象是不是不是“数组类型”【英文标题】:Python: check if an object is NOT an "array-type"Python:检查对象是否不是“数组类型” 【发布时间】:2011-11-05 11:46:08 【问题描述】:

我正在寻找一种方法来测试一个对象是否不是“list-ish”类型,也就是说 - 不仅该对象不可迭代(例如 - 你也可以运行 iter em> 在字符串上,或在实现 iter 的简单对象上)但该对象不在列表族中。我将“list”系列定义为 list/tuple/set/frozenset,或者任何从它们继承的东西,但是 - 因为可能有一些我遗漏的东西,我想找到更多比对所有这些类型运行isinstance 的一般方法。

我想到了两种可能的方法,但似乎都有些尴尬,因为它们对每种可能的列表类型进行了非常多的测试,我正在寻找更通用的解决方案。

第一个选项:

return not isinstance( value, (frozenset, list, set, tuple,) )

第二个选项:

return not hasattr(value, '__iter__')

测试__iter__ 属性是否足够?有没有更好的方法来判断一个对象是否不是列表类型?

提前致谢。

编辑

引用@Rosh Oxymoron 的解决方案的评论): 现在更好地考虑定义,我认为更正确的说法是我需要找到定义中不是数组类型的所有内容,但它仍然可以是字符串/其他简单对象...检查对于实现 __iter__ 方法的对象,collections.Iterable 仍会为我提供 True

【问题讨论】:

每次您进行类型检查时,您都可能做错了什么。你到底想做什么? 基本上我有一个类,它包含一个特定类型的变量并以某种方式对其进行操作。我只是想断言用户给了我正确的类型。我只知道它不应该是一个数组。 @Amit 为什么不基本上遵循python的其余部分并接受任何东西,如果它不支持必要的操作,稍后会失败?看起来更简单,更面向未来,更“pythonic”(鸭子打字等等) 【参考方案1】:

没有术语“list-ish”,也没有内置的魔法check_if_value_is_an_instance_of_some_i_dont_know_what_set_of_types

not isinstance( value, (frozenset, list, set, tuple,) ) 的解决方案非常好 - 清晰明确。

【讨论】:

【参考方案2】:

没有这样的家庭——它没有明确定义,自然没有办法检查它。最接近的可能是不是字符串的可迭代对象。您可以测试对象是否可迭代,然后显式检查它是否为字符串:

if isinstance(ob, collections.Iterable) and not isinstance(ob, types.StringTypes):
    print "An iterable container"

更好的方法是始终请求一个可迭代对象,当您需要传递单个字符串 S 时,改为传递 [S]。传递字符串的能力是一个特性,例如:

alphabet = set('abcdefgijklmopqrstuvwxyz')

如果你是特殊情况的字符串,你会:

    以最自然的方式传递字符集合,打破使用函数的能力。 为用户定义的字符串类型和/或其他类似字符串的容器创建不一致(例如,array.array 可以表示一大块数据,就像字符串一样)。

一个字符串既可以用来表示单个文本,也可以用来表示字符集合,并且由于第二个,它也是列表式的。

【讨论】:

感谢您的详尽评论!但是,现在更好地考虑定义,我相信说我需要找到定义中不是数组类型的所有内容(可以通过在 if 中的第一个条件中添加 'not' 来实现)更正确,但是它仍然可以是字符串/其他简单对象...我能想到的最佳定义是 - 定义中不是数组类型的任何东西。检查 collections.Iterable 仍然会给我 True 对于实现 __iter__ 方法的对象。

以上是关于Python:检查对象是不是不是“数组类型”的主要内容,如果未能解决你的问题,请参考以下文章

如何检查一个对象在 Python 中是不是可迭代? [复制]

python是不是有检查对象是不是具有属性的简写? [复制]

如何检查我的 python 对象是不是为数字? [复制]

Python set([]) 如何检查两个对象是不是相等?一个对象需要定义哪些方法来自定义它?

如何检查返回对象是不是是python中的字典[重复]

Python——检查对象是不是是某个模块中任何类的实例