2016-10-12 3 views
1

Selon ce poste:Quelle est l'implémentation la plus proche de '@transient lazy val' de scala dans Python?

Python memoising/deferred lookup property decorator

Un décorateur mnémoniques peut être utilisé pour déclarer une propriété paresseuse dans une classe. Il y a même un paquet « officiel » qui peut être utilisé hors de la boîte:

https://pypi.python.org/pypi/lazy

cependant, ces deux la mise en œuvre a un grave problème: toutes les valeurs mémorisées seront tentées à décaper par python. Si ces valeurs ne peuvent pas être copiées, le programme se décomposera.

Ma question est la suivante: existe-t-il un moyen facile de mettre en œuvre la déclaration "@transient lazy val" de scala sans trop de bricolage? Cette déclaration doit mémoriser la propriété en cas d'invocation multiple et la supprimer une fois que la classe/l'objet est sérialisé.

Répondre

1

Ignorant les détails de mise en œuvre de scala, mais la solution la plus simple vient à l'esprit, si vous êtes satisfait d'autres aspects de la bibliothèque « propriété paresseuse » que vous avez trouvé, serait mise en œuvre __getstate__ et __setstate__ méthodes d'objet, comme décrit Ces méthodes sont appelées par le gestionnaire Pickle/Unpickle lors de la sérialisation de l'instance de l'objet (de). De cette façon, vous pouvez avoir un contrôle précis de comment/quels attributs de votre objet sont sérialisés. Vous devriez également lire la documentation correspondante sur deux autres méthodes liées au pickle (prendre en compte le __getinitargs__ en particulier). Python désérialisée objets initialisation differes de séquence commune __new__ & __init__

+0

je pensais, mais je ne trouve pas de mise en œuvre de __getstate__ dans la superclasse comme point de référence, ainsi que, le point de décorateur est la simplicité, si le décorateur ne peut pas affecter composition de décapage seul, alors je ne pense pas que c'est un décorateur très pratique. – tribbloid

+0

en tant que états de la documentation de pickle Python: 'S'il n'y a pas de méthode __getstate __(), __dict__ de l'instance est pickled'. Donc, vous pouvez simplement pickle/unpickle superclasse '__dict__' vous-même. Possibilité de gérer de telles propriétés uniquement avec des décorateurs ... Hmm, je ne suis pas sûr de cela – agg3l