Как проверить, является ли объект экземпляром именованного кортежа?
Как проверить, является ли объект экземпляром Именованный кортеж?
Ответы
Ответ 1
Вызов функции 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)
Возможно получить ложный результат от этого, но только если кто-то собирается сделать свой тип, который выглядит как лот, как именованный кортеж, но не один;-).
Ответ 2
Я понимаю, что это старо, но я нашел это полезным:
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
Ответ 3
Если вам нужно проверить перед вызовом определенных функций namedtuple на нем, тогда просто вызовите их и поймайте исключение. Это предпочтительный способ сделать это в python.
Ответ 4
Улучшение того, что написал Лутц:
def isinstance_namedtuple(x):
return (isinstance(x, tuple) and
isinstance(getattr(x, '__dict__', None), collections.Mapping) and
getattr(x, '_fields', None) is not None)
Ответ 5
Я использую
isinstance(x, tuple) and isinstance(x.__dict__, collections.abc.Mapping)
который для меня, по-видимому, лучше всего отражает словарьский аспект характера названных кортежей.
Он кажется надежным и для некоторых возможных будущих изменений, а также может работать со многими сторонними классами namedtuple-ish, если такие вещи существуют.