Digamos que eu tenha uma classe simples em python
class Wharrgarbl(object): def __init__(self, a, b, c, sum, version="old" ): self.a = a self.b = b self.c = c self.sum = 6 self.version = versão def __int__(self): return self.sum + 9000 def __what_goes_here__(self): return {"a" : self.a, "b": self.b, "c": self.c}
Posso convertê-lo para um inteiro muito facilmente
>>> w = Wharrgarbl("um", "dois", "três", 6) >>> int(w) 9006
O que é ótimo! Mas, agora quero convertê-lo em um dict de maneira semelhante
>>> w = Wharrgarbl("um", "dois", "três", 6) >>> dict(w) {"a": "um", "c": "três", "b": "dois"}
O que eu preciso definir para que isso funcione ? Tentei substituir __dict__
e dict
por __what_goes_here__
, mas dict(w)
resultou em um TypeError : O objeto Wharrgarbl não é iterável
em ambos os casos. Eu não acho que simplesmente tornar a classe iterável resolverá o problema. Eu também tentei muitos googles com tantas palavras diferentes de "python cast object to dict" quanto eu poderia pensar, mas não consegui encontrar nada relevante:{
Também! Observe como chamar w.__dict__
não fará o que eu quero porque vai conter w.version
e w.sum
. Desejo personalizar a conversão para dict
da mesma forma que posso personalizar a conversão para int
usando def int(self)
.
Sei que poderia fazer algo assim
>>> w.__what_goes_here__() {"a": "um", "c": "três", "b": "dois"}
Mas estou assumindo que existe uma maneira pythonic para fazer dict(w)
funcionar, pois é o mesmo tipo de coisa que int(w)
ou str(w)
. Se não houver uma maneira mais pythonic, tudo bem também, imaginei que eu perguntaria. Oh! Eu acho que já que isso importa, isso é para o python 2.7, mas super pontos de bônus para uma solução 2.4 antiga e quebrada também.
Há outra pergunta Sobrecarregando __dict__() na classe python que é semelhante a este, mas pode ser diferente o suficiente para garantir que não seja uma duplicata. Acredito que o OP esteja perguntando como converter todos os dados em seus objetos de classe como dicionários. Estou procurando uma abordagem mais personalizada na medida em que não quero tudo em __dict__
incluído no dicionário retornado por dict()
. Algo como variáveis públicas vs privadas pode ser suficiente para explicar o que estou procurando. Os objetos estarão armazenando alguns valores usados em cálculos e de tal forma que eu não preciso/quero aparecer nos dicionários resultantes.
UPDATE: Eu escolhi usar o asdict
rota sugerida, mas foi uma escolha difícil selecionar o que eu queria que fosse a resposta para a pergunta. Ambos @RickTeachey e @jpmc26 forneceram a resposta com a qual eu vou rolar, mas o primeiro tinha mais informações e opções e também obteve o mesmo resultado e foi mais votado, então eu fui com ele. Eu espreitei por muito tempo no stackoverflow e estou tentando colocar mais os dedos dos pés na água.