我使用的是ZODB
,據我瞭解,它使用pickle
來存儲類實例。我正在做一些重構,我想將我的models.py
文件分成幾個文件。但是,如果我這樣做,我不認爲pickle
將能夠找到類定義,因此將無法加載我已經存儲在數據庫中的對象。處理這個問題的最好方法是什麼?pickle/zodb:如何處理使用類定義移動.py文件?
回答
您可以創建別名;因爲一個models.py
模塊正在拆分成多個新模塊,所以只能通過將您的類導入舊位置來完成此操作。
這兩種方法都會導致實例泡菜的新副本引用新位置;如果您可以強制在上寫所有移動類的實例,則不需要保留別名。你可以通過在你想要再次寫入的實例上設置_p_changed
到True
來實現。
所以,要創建別名,在原來的位置導入您的移動類:
from newmodule1 import MyClass1, MyClass2
from newmodule2 import MyClass3
如果你只重命名模塊(所以所有的都在一個新的地點發現了同樣的課程,可能是一套進口本身),你還可以創建舊名稱的sys.modules
條目:
import sys
import newmodule
sys.modules['full.path.to.old.module] = newmodule
不幸的是,沒有簡單的解決方案。您可以通過以下模式與重構的人(我的意思是這是在另一個文件/模塊類)轉換您舊式對象
- 添加重構的類代碼沒有刪除舊的,那些
- 穿行您的數據庫從根開始,用新更換等同所有老對象
- 壓縮數據庫(這很重要)
- 現在你可以從源代碼刪除您老班
贊成我希望沒有做這樣的事情。別名解決方案似乎很有前途... – Claudiu
@Claudiu我不喜歡混疊解決方案,因爲它帶來了混亂的代碼。但它的作品當然是:-) –
只要您希望在不執行向新類模型結構的遷移的情況下加載醬菜,您可以在舊model.py的位置內使用重構類的別名導入。
- 1. 使用批處理文件移動特定數量的文件
- 2. 處理後移動文件
- 3. 如何使用命令行通過批處理文件運行.py文件
- 4. 如何處理「類類型重定義」
- 5. 使用批處理腳本在文件名中移動文件
- 6. 使用批處理文件移動* .log除外的文件
- 7. 自動移動批處理文件
- 8. 自定義窗口移動代碼。如何處理快速鼠標移動? [WPF]
- 9. 批處理文件移動特定文件
- 10. python解釋器如何處理基本的.py文件?
- 11. 如何讓不同的py文件處理不同的路線?
- 12. 使用批處理文件跨驅動器移動目錄
- 13. 如何使用自定義異常處理程序處理javax.el.PropertyNotFoundException
- 14. 如何打開批處理文件中的自定義文件
- 15. 將.py文件中的數據(基於類)從另一個.py文件移動到另一個文件
- 16. 如何使用lftp批處理文件獲取特定文件
- 17. 處理後的Apache Camel移動文件
- 18. git-svn處理移動的文件
- 19. 使用批處理文件在名稱中使用空格移動文件
- 20. 如何從TFS構建定義調用批處理文件?
- 21. 「目標不能處理這種類型的文件」移動到自定義虛擬文件夾
- 22. 使用批處理文件創建文件夾和移動文件
- 23. 如何我手動從.py文件
- 24. 用於文件移動的dos批處理文件
- 25. 移動文檔類型定義
- 26. 如何使批處理腳本將文件移動到聯網驅動器
- 27. 處理CSS並將類移動到新文件的腳本?
- 28. 如何在無需移動批處理文件的情況下
- 29. 的Python在單獨的PY文件中定義類函數
- 30. 如何使用批處理腳本刪除文件中的用戶定義行
啊,這似乎是我想要的。因此,加載現有實例時,pickle會查看舊的'models.py',查找類名,並正確加載類,但加載的類實際上將位於新的位置...... clever – Claudiu
@Claudiu:Exactly ,所以當爲這個類寫一個新的pickle時,它會使用新的模塊路徑。 –