2016-01-19 52 views
3

我想從字典中導出並覆蓋缺少的方法。我想做一些東西,然後仍然稱它的超級功能。事情是這樣的:如何從字典中調用__missing__

class Foo(dict): 
    def __missing__(self, key): 
     print('missing {}'.format(key)) 
     return super().__missing__(key) 

然而其產生:

AttributeError: 'super' object has no attribute '__missing__' 

當然,我仍然可以使用工作程序:

raise KeyError(key) 

但我寧願稱之爲超級功能。因爲除了引發KeyError之外,代碼可能會(或者可能在未來的python版本中)在super().__missing__中執行。

+1

沒有'字典。__missing__'方法;如果你爲你的dict子類提供了一個'__missing__',你應該自己返回一個值或者提出一個錯誤,而不是試圖將它委託給'dict'。 – user2357112

回答

6

沒有dict.__missing__;只需撥打電話super().__missing__(並提出KeyError)。方法是可選並且沒有默認實現。

或者,如果你要正確地支持多重繼承,你可以捕捉AttributeError例外:從collections.defaultdict

class Foo(dict): 
    def __missing__(self, key): 
     print('missing {}'.format(key)) 
     try: 
      return super().__missing__(key) 
     except AttributeError: 
      raise KeyError(key) 
+0

自己放棄超級通話是不夠的,因爲那樣你會爲所有丟失的鍵取得「無」。 – user2357112

+0

@ user2357112:這個想法是你提出'KeyError',我會澄清。 –

+0

對不起,馬丁,錯的樹。我希望我也收到了評論(現在2)。答案可能不像你的那樣出現,但imho它也可能是OP的替代品。星期六有人對我的回答有6行咆哮,因爲它被選爲答案,他也低估了它...... – mementum

0

子類,已經有失蹤方法。

https://docs.python.org/3/library/collections.html#collections.defaultdict

__missing__

如果default_factory屬性是None,這就提出了一個KeyError例外與作爲參數。

如果default_factory不是None,它不帶參數調用 爲給定默認值,這個值被插入 字典爲關鍵,並返回。

如果調用default_factory產生異常,則此例外是 傳播不變。

此方法由dict類 的__getitem__()方法調用時所請求的未找到;無論它返回還是提高 然後返回或提高__getitem__()

注意__missing__()呼籲任何操作,除了 __getitem__()。這意味着get()將像普通字典一樣將None作爲默認值返回,而不是使用default_factory

+0

謝謝你的回答。但我實際上更喜歡'dict'的子類。 –

+0

永遠是你的選擇,只是想提供一個選擇 – mementum