Eu tenho uma classe de tupla nomeada em python
class Town(collections.namedtuple('Town', [
'name',
'population',
'coordinates',
'population',
'capital',
'state_bird'])):
# ...
Gostaria de converter instâncias do Town em dicionários. Não quero que ele esteja rigidamente vinculado aos nomes ou ao número dos campos de uma cidade.
Existe uma maneira de escrevê-lo de forma que eu possa adicionar mais campos ou passar uma tupla nomeada totalmente diferente e obter um dicionário.
Não posso alterar a definição de classe original como está no código de outra pessoa. Então, preciso pegar uma instância de uma cidade e convertê-la em um dicionário.
python
dictionary
tuples
namedtuple
Sem mim, apenas Aweso
fonte
fonte
dir
comando, que mostrará os campos para qualquer objeto ... que mostraria a_asdict
função diretamente.dict
vez de 'namedtuple' e passar o nomeduplo para o inicializador. Lembre-se de que, se você está acostumado ao Cxx,class Town(x)
não é o construtor, estádef __init__(self, *args, **kwargs)
dentro dele.dir
é apenas um python embutido ... você pode executá-lo em qualquer objeto python, em um console ou em um script (onde retorna uma lista com a qual você pode imprimir ou fazer o que quer que seja) e retornará uma lista de (quase ) todos os atributos do objeto. útil se você estiver tentando descobrir como um objeto desconhecido funciona.Respostas:
TL; DR: existe um método
_asdict
fornecido para isso.Aqui está uma demonstração do uso:
Este é um método documentado de nomeados simples, ou seja, diferente da convenção usual em python, o sublinhado principal no nome do método não existe para desencorajar o uso . Junto com os outros métodos adicionados ao namedtuples,
_make
,_replace
,_source
,_fields
, tem o sublinhado só para tentar evitar conflitos com possíveis nomes de campo.Nota: Para algum código 2.7.5 <python versão <3.5.0 disponível, você pode ver esta versão:
Por um tempo, a documentação mencionou que
_asdict
estava obsoleta (veja aqui ) e sugeriu o uso dos vars do método interno . Esse conselho agora está desatualizado; para corrigir um erro relacionado à subclasse, a__dict__
propriedade presente nos nomeados foi removida novamente por esse commit .fonte
_asdict
que não deva ser aliasado na biblioteca padrãoasdict
?"asdict"
ser um dos nomes das tuplas.Existe um método embutido nas
namedtuple
instâncias para isso_asdict
,.Conforme discutido nos comentários, em algumas versões
vars()
também o fará, mas aparentemente é altamente dependente dos detalhes da compilação, embora_asdict
deva ser confiável. Em algumas versões,_asdict
foi marcado como obsoleto, mas os comentários indicam que esse não é mais o caso a partir do 3.4.fonte
_asdict
método foi tornado obsoleto em python3 (em favor de vars)vars
não funciona em algumas versões mais antigas - no 2.7, gera aTypeError
, já que anamedtuple
classe dessa versão não possui um__dict__
atributo.No Ubuntu 14.04, versões LTS do python2.7 e python3.4, a
__dict__
propriedade funcionava conforme o esperado. O_asdict
método também funcionou, mas estou inclinado a usar a API de propriedade uniforme, definida por padrões, em vez da API não uniforme localizada.$ python2.7
Ver como ditado é a maneira semântica de obter um dicionário representando algo, (pelo menos até onde sei).
Seria bom acumular uma tabela das principais versões e plataformas de python e seu suporte
__dict__
, atualmente só tenho uma versão de plataforma e duas versões de python, conforme publicado acima.fonte
__dict__
não funciona.Caso # 1: tupla de uma dimensão
Caso 2: tupla de duas dimensões
Exemplo: DICT_ROLES [961] # mostrará 'Programador de Back-End'
fonte
se não _asdict (), você pode usar desta maneira:
fonte
Python 3. Aloque qualquer campo para o dicionário como o índice necessário para o dicionário, usei 'name'.
fonte