ZODB
を使用していますが、理解しているように、pickle
を使用してクラスインスタンスを格納しています。私は私のmodels.py
ファイルをいくつかのファイルに分割するリファクタリングをやっています。しかし、私がこれを行うと、私はpickle
がクラス定義を見つけることができないと思うので、すでにデータベースに保存されているオブジェクトをロードすることはできません。この問題を処理する最善の方法は何ですか?pickle/zodb:動く.pyファイルをクラス定義で扱う方法?
答えて
エイリアスを作成できます。 1つのmodels.py
モジュールが複数の新しいモジュールに分割されているため、クラスを古い場所にインポートすることによってのみ行うことができます。
どちらの方法でも、インスタンスのピクルスの新しいコピーが新しい場所を参照します。 にすべてのの移動したクラスのインスタンスを強制的に書き込むことができれば、エイリアスを保持する必要はありません。これを行うには、再度書きたいインスタンス上に_p_changed
〜True
を設定します。
ので、エイリアスを作成するには、古い場所に移動するクラスをインポートすること:あなたが唯一のモジュール(すべて1つの新しい場所で発見されたので、同じクラスのの名前を変更する場合
from newmodule1 import MyClass1, MyClass2
from newmodule2 import MyClass3
、かもしれません私はそのような何かを行う必要がないように期待していたエイ
import sys
import newmodule
sys.modules['full.path.to.old.module] = newmodule
残念ながら、簡単な解決策はありません。あなたは
は、古いものを削除せずに自分のコード にリファクタリングクラスを追加-
次のスキーマによってリファクタリングのもの(私は別のファイル/モジュールにあるクラスを意味する)を使用して古いスタイルのオブジェクトに変換することができますあなたのDB経由
- 徒歩ルートから始まり、データベースを圧縮する新しい同等
- ですべて古いオブジェクトを交換する(それは重要です)
- 今あなたがソース から古いクラスを削除することができます
:輸入自身)のセットは、あなたも古い名前のためsys.modules
エントリを作成することができます。エイリアスソリューションは有望なようだ... –
Claudiu
@Claudiuエイリアス解決策が気に入らないのは、コードが混乱するからです。しかし、それはもちろん動作します:-) –
新しいクラスモデル構造への移行を実行せずにpickleをロード可能にしたい場合は、リファクタリングされたクラスのエイリアスインポートを古いmodel.pyの場所内で使用できます。
- 1. typescript 2.0で外部未定義変数を扱う方法
- 2. "現実の世界"のIoC - 多くのクラスを扱う方法?
- 3. AngularFire2のクラス:$ keyを扱う方法
- 4. Pythonはクラスファイルを別個のpyファイルで定義します
- 5. OSMDroidマップで動くアイテムを扱う方法
- 6. 外部PHPファイルでWP_QUERYクラスを定義する方法は?
- 7. タイプスクリプト宣言ファイルでシングルトンのjavascriptクラスを定義する方法
- 8. typings.jsonファイルでローカル.d.tsファイル定義を定義する方法
- 9. Pythonファイルの編集にVIMオートインデントを正しく設定する方法 - * .py
- 10. numpyの:未定義の値を扱う、csvファイルを読む
- 11. メソッド(セプファイル)を__init__.pyで定義されたクラスにインポートするためのきれいな方法
- 12. ユーザー定義のデータ構造を扱う
- 13. Meteor.methodの '未定義'プロパティを扱う
- 14. 多くのドロウアブルを扱う方法
- 15. wxpythonのイベントを別のクラスの別のファイルで扱う方法は?
- 16. クラス定義を__init__.pyに入れることはできますか?
- 17. ReagentまたはRe-Frameアプリケーションで動的クラスを扱う慣習的な方法
- 18. このクラスを定義する方法
- 19. クラスを定数として扱う
- 20. Typescript定義ファイルでクラスを定義する
- 21. 〜をファイルパスで扱う方法
- 22. 関数内でPHP静的クラス変数を扱う方法
- 23. ルビーでクラスと依存関係を扱う方法
- 24. C++スクリプト言語を書くときにクラスの型を扱う方法
- 25. py2exeでexecfile()で起動された.pyファイルをバンドルする方法は?
- 26. クラスのオブジェクトをジェネリックと同じように扱う方法
- 27. C++は再帰的なクラス定義をどのように扱いますか?
- 28. ハイクリンクでonclicksを最もうまく扱う方法
- 29. NameErrorは:グローバル名が別の.pyファイルで定義されたグローバル変数で定義されていない
- 30. ES6クラスでクラスレベル定数を定義する方法
ああ、これは私が欲しいものと思われる。だからpickleは、既存のインスタンスをロードするとき、古い 'models.py'を見て、クラス名を見つけ、クラスを適切にロードしますが、ロードされたクラスは実際に新しい場所にあります...賢い – Claudiu
@Claudiu:ので、クラスのための新しいピクルスを書くとき、それは新しいモジュールパスを使用します。 –