Estoy tratando de convertir los datos de un simple gráfico de objetos en un diccionario. No necesito información o métodos de tipo y no necesito volver a convertirlo en un objeto.Convertir recursivamente el gráfico de objetos de Python al diccionario
Encontré this question about creating a dictionary from an object's fields, pero no lo hace recursivamente.
Siendo relativamente nuevo en python, me preocupa que mi solución pueda ser fea, o antiponética, o que se rompa de alguna manera oscura, o simplemente vieja NIH.
Mi primer intento pareció funcionar hasta que lo intenté con listas y diccionarios, y me pareció más fácil simplemente comprobar si el objeto pasado tenía un diccionario interno, y si no, simplemente tratarlo como un valor (en lugar de hacerlo todo eso es comprobación de instancia). Mis intentos anteriores tampoco son recursivos en listas de objetos:
def todict(obj):
if hasattr(obj, "__iter__"):
return [todict(v) for v in obj]
elif hasattr(obj, "__dict__"):
return dict([(key, todict(value))
for key, value in obj.__dict__.iteritems()
if not callable(value) and not key.startswith('_')])
else:
return obj
Esto parece funcionar mejor y no requiere excepciones, pero de nuevo todavía no estoy seguro de si hay casos que aquí no estoy al tanto de donde cae
Cualquier sugerencia sería muy apreciada.
en Python no es tan malo para usar excepciones ya veces puede simplificar la codificación, una manera- Pythonic EAFP (más fácil pedir perdón que permiso) –
caso especial podría ser cuando el objeto tiene __slots__, respuesta editada –
punto tomado, pero la excepción es un poco de guerra santa y tiendo a preferir que nunca sean arrojados a menos que algo sea realmente excepcional, en lugar de un flujo de programa esperado. cada uno por su cuenta en ese caso :) – Shabbyrobe