Travailler sur un projet qui nécessite que je sois capable de corner l'objet du conteneur à tout moment, car nous nous attendons à ce que cela échoue sur des conditions externes assez fréquemment et que vous puissiez récupérer complètement où nous nous sommes arrêtés.
I ' m Utilisation de la bibliothèque de journalisation Python de manière assez approfondie, et toutes mes classes commencent par configurer un enregistreur comme: p> car je décroche une classe de conteneur, il a plusieurs couches des classes en elle, chacune avec leur propre instance de Logger. P> Maintenant, pour une raison quelconque, ces enregistreurs brisent le cornichon. Je reçois l'erreur suivante, qui s'en va si je supprime self.logger de toutes les classes: p> Donc, ma question est de savoir si une façon de supprimer ou non Les objets de verrouillage de tous les enregistreurs sans avoir à se recueillir à travers mon arborescence de mon objet entier supprimant les enregistreurs que je devrai recréer sur un impression sur un impeccable. P> P>
5 Réponses :
Vous pouvez créer une classe qui enveloppe l'enregistreur et les implements Ceci est collé de http: //docs.python .org / bibliothèque / pickle.html . Le __ getstate __ code> et
__ __ SetState __ code>.
FH code> est traité de manière similaire à ce dont vous avez besoin. P>
a trouvé une question très similaire ici, avec une réponse qui a fonctionné pour moi: p>
Comment arrêter les attributs d'être mariné à Python a> p>
EDIT: utilisé cette réponse: Comment Pour arrêter les attributs d'être mariné dans Python P>
Peut-être que vous pourriez être associé à (ou citer) la réponse exacte que vous avez utilisée? (Il y en a deux) il y a un bouton "lien" sous toute réponse que vous pouvez cliquer pour l'URL.
Vous auriez pu utiliser dill code> ici, qui peut corroger des enregistreurs et des verrous.
>>> class foo:
... def __init__(self):
... self.logger = logging.getLogger("package.foo")
...
>>> import dill
>>> import logging
>>>
>>> f = foo()
>>> _f = dill.dumps(f)
>>> f_ = dill.loads(_f)
>>> f_.logger
<logging.Logger object at 0x110b1d250>
Vous pouvez également créer une classe qui implémente une propriété qui renvoie l'enregistreur nécessaire. Chaque classe qui hérite de cette "loggermixin" est maintenant capable d'utiliser l'enregistreur de la même manière que vous l'utilisiez avant.
class LoggerMixin(): @property def logger(self): component = "{}.{}".format(type(self).__module__, type(self).__name__) return logging.getLogger(component) class Foo(LoggerMixin): def __init__(self): self.logger.info("initialize class") def bar(self): self.logger.info("execute bar")
Ceci est une réponse négligée mais agréable.
enregistreur code> peut maintenant être mariné comme beaucoup d'autres objets. p>
Juste une note, les enregistreurs peuvent être marinés; Cependant, tout ce qu'il fait est d'appeler getlogger à nouveau. Donc, si vous utilisez des multirocesses, vous devez toujours configurer la journalisation avant d'utiliser l'enregistreur de processus engendré.