Pergunta

Como faço para verificar se um objeto é uma instância de um Nomeado tupla?

Foi útil?

Solução

Chamando o função collections.namedtuple dá a você um novo tipo que é uma subclasse de tuple (e nenhuma outra aula) com um membro chamado _fields Essa é uma tupla cujos itens são todos as cordas. Então você pode verificar se cada uma dessas coisas:

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)

É possível obter um falso positivo disso, mas apenas se alguém estiver se esforçando para fazer um tipo que parece um muito Como uma tupla nomeada, mas não é uma ;-).

Outras dicas

Eu percebo que isso é velho, mas achei isso útil:

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

Se você precisar verificar antes de ligar para as funções específicas do nome do nome do nome, basta ligar para eles e pegue a exceção. Essa é a maneira preferida de fazê -lo em Python.

Melhorando o que Lutz postou:

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

eu uso

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

O que para mim parece melhor refletir o aspecto do dicionário da natureza das tuplas nomeadas. Parece robusto contra algumas mudanças futuras concebíveis também e também pode funcionar com muitas classes de terceiros nomeados, se essas coisas existirem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top