Как проверить, является ли объект экземпляром именованного кортежа? - PullRequest
32 голосов
/ 30 января 2010

Как проверить, является ли объект экземпляром Именованного кортежа ?

Ответы [ 5 ]

36 голосов
/ 30 января 2010

Вызов функции 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)

Возможно получить ложный положительный результат от этого, но только если кто-то изо всех сил пытается сделать тип, который выглядит как lot как именованный кортеж, но не один ;-).

16 голосов
/ 29 декабря 2016

Я понимаю, что это старый, но я нашел это полезным:

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
4 голосов
/ 30 января 2010

Если вам нужно проверить перед вызовом определенных функций namedtuple для него, просто вызовите их и вместо этого перехватите исключение. Это предпочтительный способ сделать это в Python.

2 голосов
/ 16 марта 2018

Улучшение того, что написал Лутц:

def isinstance_namedtuple(x):                                                               
  return (isinstance(x, tuple) and                                                  
          isinstance(getattr(x, '__dict__', None), collections.Mapping) and         
          getattr(x, '_fields', None) is not None)                                  
0 голосов
/ 20 июня 2014

Я использую

isinstance(x, tuple) and isinstance(x.__dict__, collections.abc.Mapping)

, что, мне кажется, лучше всего отражает словарный аспект природы именованных кортежей. Он выглядит устойчивым и к некоторым возможным будущим изменениям и может работать со многими сторонними классами namedtuple-ish, если такие вещи существуют.

...