je peux utiliser YAML pour vider une hiérarchie d'objets de python, donc:sélectif de vidage des attributs d'objet avec PyYAML
import yaml
class C():
def __init__(self, x, y):
self.x = x
self.y = y
class D():
def __init__(self, c, d):
self.c = c
self.d = d
d = D(c=C(x=1, y='hi'),
d='bye')
print yaml.dump(d)
produit la sortie:
!!python/object:__main__.D
c: !!python/object:__main__.C {x: 1, y: hi}
d: bye
Mais je veux me cacher de manière sélective certains attributs. supposons que j'ai donc une fonction attribs_to_dump(obj)
qui pour tout objet retourne la liste des noms d'attributs que je veux jeter, par exemple:
def attribs_to_dump(obj):
if obj.__class__ == C: return ['x']
if obj.__class__ == D: return ['c']
Ma question est, comment puis-je le crochet attribs_to_dump
dans yaml.dump
pour que je reçois la sortie suivante ?
!!python/object:__main__.D
c: !!python/object:__main__.C {x: 1}
Il y a un facteur de complication: Je veux obtenir l'effet en accrochant dans YAML comme il se traîne sur la hiérarchie des objets plutôt que par pré-traitement de la hiérarchie d'objets moi-même. La raison en est que tous les objets de la hiérarchie sont facilement prête à l'introspection en raison de setattr/getattr/__dict__
magique qui est présent dans certaines bibliothèques, je me sers: - (...
Toutes aide a beaucoup apprécié
Vous avez en effet fourni une réponse à ma question, mais dans mon cas deepcopy ne fonctionnera pas parce que les objets que je suis sérialisation sont très magique - la magie et métaclasse getattr/setattr très ésotériques. Je dois ajouter quelques règles au jeu dans la question. – SimonD