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是不是有检查对象是不是具有属性的简写? [复制]