【发布时间】: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”(鸭子打字等等)
标签: python arrays list iterable