2016-11-30 58 views
0

我決定爲個人需求創建一個小跟蹤列表。 我創建了兩個主要類來存儲和處理數據。第一個代表主題和練習列表。第二個代表練習列表中的每個練習(主要是兩個變量,全部(全部)答案和正確答案)。擱架(或泡菜)不能正確保存對象字典。它只是丟失了數據

class Subject: 
    def __init__(self, name): 
     self.name = name 
     self.exercises = [] 

    def add(self, exc): 
     self.exercises.append(exc) 

    # here is also "estimate" and __str__ methods, but they don't matter 


class Exercise: 
    def __init__(self, good=0, whole=20): 
     self._good = good 
     self._whole = whole 

    def modify(self, good, whole=20): 
     self._good = good 
     self._whole = whole 

    # here is also "estimate" and __str__ methods, but they don't matter 

我定義了一個字典,主題爲實例填充它,它轉移到貨架文件並保存它。

with shelve.open("shelve_classes") as db: 
    db.update(initiate()) 

這裏的表示(啓動狀態):

#Comma splices & Fused sentences (0.0%) 
#0/20  0.0% 
#0/20  0.0% 
#0/20  0.0% 
#0/20  0.0% 
#0/20  0.0% 

在那之後,我試圖重新打開傾倒文件和更新一些的值。

with shelve.open('shelve_classes') as db: 
    key = 'Comma splices & Fused sentences' 
    sub = db[key] 
    sub.exercises[0].modify(18) 
    db[key] = sub 

看起來沒問題,讓我們回顧一下吧:

print(db[key]) 

#Comma splices & Fused sentences (18.0%) 
#18/20  90.0% 
#0/20  0.0% 
#0/20  0.0% 
#0/20  0.0% 
#0/20  0.0% 

但是當我關閉文件,下一次我打開它,它回來了啓動狀態,所有的修正損失。即使用泡菜試過,也不在那兒工作。無法弄清楚,爲什麼它不保存數據。

回答

3

,當你發生變異對象的shelve模塊沒有注意到,只有當你給它分配:

因爲Python的語義,當可變持久字典項被修改的架子不知道。默認情況下,修改後的對象僅在分配給書架時才寫入。

因此它不認爲sub.exercises[0].modify(18)是需要重寫回磁盤的操作。

嘗試打開數據庫時writeback標誌設置爲True。然後,它會在數據庫關閉時重新保存數據庫,即使它沒有明確檢測到任何更改。

with shelve.open('shelve_classes', writeback=True) as db: 
    key = 'Comma splices & Fused sentences' 
    sub = db[key] 
    sub.exercises[0].modify(18) 
    db[key] = sub 
+0

是的,它的工作原理,謝謝。其實發現了我的代碼的另一個問題。所有這些操作我在單獨的文件中完成,當我用'pickle'嘗試時,解釋器要求我將定義的類導入到工作文件中。我做到了,但後來決定用'shelve'重寫所有內容,並忘記刪除導入的代碼。這不知何故影響到外流。所有更改都保存到文件中,但是當我嘗試重新運行腳本時,輸出會以某種方式將原始數據(來自'shelve')替換爲導入的類並顯示啓動狀態。不知道,它是什麼意思。不管怎樣,謝謝你。 – tidylobster

-1

不要你需要關閉分貝?像

db.close() 
+0

這就是'with'語句的美妙之處:它會自動爲您關閉資源,而無需執行任何操作。 – Kevin

+0

當我寫評論時,你發佈了你的評論。 –