簡體   English   中英

在python中刪除繼承的dict元素

[英]Deleting inherited dict elements in python

我有一個對象的字典,該對象將按以下方式銷毀。

class Elem:
    def __init__(self, name):
       self.name = name
    .
    .
    def __del__(self):
       print('destroying elem' + self.name)

class DerivedDict(dict):
    def __init__(self):
       super(DerivedDict, self).__init__()

    def __del__():
        for k in self.keys():
            del self[k]


elem = Elem('myname')
ddict = DerivedDict()
ddict['myname'] = elem

# this line should delete the both the elem the entry in ddict.
del ddict

當嘗試這個我得到這個錯誤

RuntimeError: dictionary changed size during iteration

您正在使用Python 3.x,並且“ keys”方法為您提供了字典鍵的實時視圖。 當這些更改更改時,由於您刪除了項目,Python無法始終如一地繼續迭代它們。

要解決此問題,只需self.keys的調用self.keyslist構造函數:因此,在迭代之前,您將獲得一個包含現有鍵的快照的列表:

def __del__():
    for k in list(self.keys()):
        del self[k]

現在,這里有一些技巧可以適當地繼承一個字典,這可能會讓您感到驚訝。 如果您想要的唯一行為是在刪除dict時顯式刪除元素,則根本不需要這樣做-否則,請參閱有關collection.UserDict的文檔-使子類化更加容易,或者請參見collections.abc.MutableSequence-兩者都應保證您需要使用最少的方法集來完成dict行為。

另一個注意事項:在對象超出范圍時,實際上依靠__del__來運行不是Python的好習慣:可能還有其他引用,它們del self.key[x]根本不會調用對象上的__del__方法。 而且在解釋器關閉期間(在程序結尾),即使對於不再正確引用的對象,也無法保證會完全調用__del__

您最好添加一個顯式delete (不是特殊的__del__ )方法並調用它,而不要依賴於del語句機制。

最好不要在迭代時刪除項目。 實際上,我認為沒有必要重寫__del__ 只需使用:

class DerivedDict(dict):
    def __init__(self):
       super(DerivedDict, self).__init__()

這也會導致__del__ Elem被調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM