如何检查对象是否为Named tuple的实例?Python:如何检查一个对象是否是namedtuple的一个实例?
回答
调用功能collections.namedtuple
为您提供了一种新型的年代tuple
与命名_fields
成员,这是一个元组,其项目全部串子类(并且没有其他类)。所以,你可以检查这些事情每一个:
def isnamedtupleinstance(x):
t = type(x)
b = t.__bases__
if len(b) != 1 or b[0] != tuple: return False
f = getattr(t, '_fields', None)
if not isinstance(f, tuple): return False
return all(type(n)==str for n in f)
有可能从该得到假阳性,但只有当有人在走出去的方式,使一个类型,看起来很多像一个命名的元组,但不是一个;-)。
正确。我还想知道为什么生成的类型不是从标记类'NamedTuple'派生的,它的定义只是'class NamedTuple(tuple):pass' ..只是为了方便我们检查一个对象是否是一个namedtuple或者不。 – 2010-01-30 04:25:05
为什么namedtuple的设计师会让它变得可怕,Sridhar?在Python中通常要避免使用类型检查,在这种情况下,不会告诉你任何有用的东西 - 具有'x'和'y'字段的名称集合以及具有'cost','price'和'quantity'字段的名称aren aren将不可互换。它们可以互换的唯一级别是它们都是元组。 即使在使用由namedtuple工厂生成的类的使用情况下,它们也只是普通类,具有很好的理由,并且可以像使用类似的手工类一样使用。 – 2010-01-30 21:20:27
@Mike:我写了一个名为元组的扩展..其中mixin声明它与指定元组一起用作其兄弟基类。所以我只需要它来声明mixin不会被其他类型滥用。 – 2010-01-30 21:32:15
如果您在调用namedtuple特定函数之前需要检查,那么只需调用它们并捕获异常。这是使用python的首选方式。
我对上面马修的回复解释了我使用这张支票的地方。 – 2010-01-30 04:31:02
我用
isinstance(x, tuple) and isinstance(x.__dict__, collections.abc.Mapping)
这对我来说似乎是最能体现一个名为元组的性质的字典方面。 它似乎对一些可以想象的将来的变化也很有效,如果这种情况发生,也可能与许多第三方命名的三类类一起工作。
这将导致错误,当'x =(1,2,3)' – kolypto 2014-09-02 10:31:43
我意识到这是旧的,但我发现这个有用:
from collections import namedtuple
SomeThing = namedtuple('SomeThing', 'prop another_prop')
SomeOtherThing = namedtuple('SomeOtherThing', 'prop still_another_prop')
a = SomeThing(1, 2)
isinstance(a, SomeThing) # True
isinstance(a, SomeOtherThing) # False
除非我失去了一些东西,这似乎是最好和最简洁的答案。 namedtuple创建一个新类型,isinstance将检查是否有某种类型。 – 2018-02-20 17:08:26
- 1. 如何检查一个对象是否是一个字符串?
- 2. 检查是否是一个对象
- 3. python 3:如何检查一个对象是否是一个函数?
- 4. 在python中如何检查一个对象是否有值?
- 5. 如何检查一个变量是否是一个类的实例?
- 6. 检查一个对象是否为空
- 7. 如何检查对象是否是一个Vue的成分?
- 8. 如何检查一个字符串是否是一个对象的实例变量?
- 9. PHP:检查一个变量是否是某个类的实例
- 10. 如何检查一个对象是否实现了一个接口?
- 11. 如何检查一个对象是不是一个数组?
- 12. 如何检查一个对象是否是Blob类型?
- 13. in_array如何检查一个对象是否在一个对象数组中?
- 14. 如何检查一个对象是否包含另一个对象?
- 15. 如何检查对象是否是特定类的实例?
- 16. 如何检查对象是否是IE中NodeList的实例?
- 17. 检查一个对象是否是委托对象
- 18. 如何检查两个对象是否属于同一个类?
- 19. 如何检查一个id是一个实例还是一个类?
- 20. 如何检查一个实例是否为枚举类型
- 21. C#:如何检查一个实例是否可序列化
- 22. 如何检查对象是否是NSArray上的最后一个对象
- 23. 检查一个类型是否是Haskell中的Show实例?
- 24. 如何检查JSON数据是一个对象还是一个对象数组?
- 25. 检查一个对象是否是Swift中的类元类型的一个实例
- 26. 如何检查一个对象是否为类c的类型?
- 27. 如何检查两个变量是否在Python中引用同一个对象?
- 28. 混淆了一个例子来检查一个对象是否是Python中的迭代器
- 29. 检查一个对象是否从一个类型继承
- 30. 检查一个集合中是否存在一个对象(T)
你需要绝对知道,或者是一种启发式好吗?如果是后者,你可以检查例如obj._asdict .__ doc__ =='返回一个新的OrderedDict,它将字段名称映射到它们的值(可能还有其他因素)。当然, – 2010-01-30 04:18:04
绝对如此。但是因为我只是在'assert'语句中使用这个“检查”(我正在向namedtuples写一个扩展......这个mixin声明它与namedtuple一起用作它的兄弟基类),启发式检查也可能是精细。我认为值得将'__doc__'检查添加到Alex的代码中。 – 2010-01-30 04:26:31
FWIW,这是提交作为一个“错误”(不知道我同意):http://bugs.python.org/issue7796 – bernie 2010-01-30 04:32:49