如何检查对象是否是Named tuple的实例?
答案 0 :(得分:36)
调用函数 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)
有可能从中获得误报,但前提是有人不顾一切地制作一个看起来像很多的类型,而不是一个名字元组;但是不是一个;-)
答案 1 :(得分:15)
我意识到这已经过时了,但我觉得这很有用:
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
答案 2 :(得分:4)
如果你需要在调用namedtuple特定函数之前检查它,那么只需调用它们并捕获异常。这是在python中执行此操作的首选方法。
答案 3 :(得分:2)
改善Lutz发布的内容:
def isinstance_namedtuple(x):
return (isinstance(x, tuple) and
isinstance(getattr(x, '__dict__', None), collections.Mapping) and
getattr(x, '_fields', None) is not None)
答案 4 :(得分:2)
3.7 +
def isinstance_namedtuple(obj) -> bool:
return (
isinstance(obj, tuple) and
hasattr(obj, '_asdict') and
hasattr(obj, '_fields')
)
答案 5 :(得分:0)
我用
isinstance(x, tuple) and isinstance(x.__dict__, collections.abc.Mapping)
对我来说似乎最能反映出命名元组性质的字典方面。 对于一些可以想象的未来变化来说,它看起来很强大,并且如果这样的事情碰巧存在,也可能适用于许多第三方命名的类。
答案 6 :(得分:0)
IMO这可能是 Python 3.6 及更高版本的最佳解决方案。
您可以在实例化命名元组时设置自定义__module__
,并在以后进行检查
from collections import namedtuple
# module parameter added in python 3.6
namespace = namedtuple("namespace", "foo bar", module=__name__ + ".namespace")
然后检查__module__
if getattr(x, "__module__", None) == "xxxx.namespace":