2016-10-12 8 views
1

この記事によると:Pythonでscalaの@transient lazy valの最も近い実装は何ですか?

Python memoising/deferred lookup property decorator

ニーモニックデコレータはクラスで怠惰なプロパティを宣言するために使用することができます。箱から出して使用することができます「公式」のパッケージにもあります:

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

しかし、これらの実装の両方が深刻な問題を抱えている:任意の記憶値は、Pythonでpickle化しようとします。これらの値をunpicklableにすると、プログラムが破壊されます。

私の質問は、あまりにもしっかりしなくてもscalaの "@transient lazy val"宣言を実装する簡単な方法はありますか?この宣言では、複数の呼び出しの場合のプロパティを覚えておいて、クラス/オブジェクトが直列化されるとその宣言をドロップする必要があります。

答えて

1

スケーラの実装の詳細を認識しないが、最も簡単な解決策が私の頭に浮かんでいる。あなたが見つけた '怠惰なプロパティ'ライブラリの他の側面に満足すれば、__getstate____setstate__オブジェクトメソッドを実装するin Pickling and unpickling normal class instances

これらのメソッドは、オブジェクトインスタンス(de)の直列化中にpickle/unpickleハンドラによって呼び出されます。

このようにして、オブジェクトのどのように/どの属性をシリアル化するかを細かく制御できます。 また、別の2つのピクルス関連の方法についても対応するドキュメントを読む必要があります(具体的には__getinitargs__の世話をしてください)。 Pythonはデコレータが影響を与えることができない場合は、デコレータのポイントはシンプルですが、私はそれを考えたが、私は基準点として、スーパークラスのいずれかの__getstate__の実装を見つけることができない、プラス__init__ & __new__共通の配列

+0

からオブジェクトの初期化differesを直列化復元それ自体で組成を酸っぱくすると、私はその非常に便利なデコレータだとは思わない。 – tribbloid

+0

Python pickleドキュメントの状態: '__getstate __()メソッドがない場合、インスタンスの__dict__はpickle'されます。だからあなたは単にスーパークラス '__dict__'を自分でpickle/unpickleすることができます。 デコレータでしかこのようなプロパティを扱うことはできません...うーん、わかりません – agg3l

関連する問題