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

StackOverflow https://stackoverflow.com/questions/2166818

Вопрос

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

Это было полезно?

Решение

Призыв функция 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)

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

Другие советы

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

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 специфических функций на нем, просто позвоните им и вместо этого поймайте исключение. Это предпочтительный способ сделать это в Python.

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

def isinstance_namedtuple(x):                                                               
  return (isinstance(x, tuple) and                                                  
          isinstance(getattr(x, '__dict__', None), collections.Mapping) and         
          getattr(x, '_fields', None) is not None)                                  

я использую

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top