2016-11-11 48 views
0

我在寫一個模擬映射對象的類。它具有以下功能。如何使__missing__自動調用__getitem__ KeyError

class MyClass(object): 
    def __init__(self): 
     self.vars = {} 

    def __getitem__(self,key): 
     return self.vars[key] 

    def __missing__(self,key): 
     return key 

我會想,爲了obj[missing_key]呼叫還將要求__missing__。但是,因爲我已經覆蓋__getitem__我必須這樣做

def __getitem__(self,key): 
    try: 
     return self.vars[key] 
    except KeyError as e: 
     return self.__missing__(key) 

看來,__missing__勾手不裹入呼叫__getitem__而是建立內部__getitem__。這使得__missing__掛鉤僅對擴展字典的類有用。在我的情況下,這是沒有意義的,我應該只在try/except內部實現缺少的功能。

有沒有辦法讓__getitem__自動撥打__missing__KeyError

+0

它看起來像它的只適用於字典的子類'如果字典的一個子類定義__missing__' – Falmarri

+0

你可以只定義與所期望的行爲mixin類的方法''__getitem__'' – Zah

+0

'__missing__'不是一般的「__getitem__'不起作用時發生了什麼」掛鉤。這是'dict .__ getitem__'特別注意的事情,實現它只對'dict'子類有意義。 – user2357112

回答

4

the docs

object.__missing__(self, key)

通過dict.__getitem__()調用來實現self[key]的字典子類時,關鍵是不是在字典。

基本上,如果你不是一個dict子類,或者你的,但你超載__getitem__沒有繼承鏈委託高達dict.__getitem__,然後__missing__沒什麼意思,因爲沒有檢查它。 你不能隱式調用__missing__,除非你是dict的子類。

如果你正在寫自己的映射類,你希望它這樣做__missing__,你並不真的需要有一個__missing__可言,只是把處理代碼在你__getitem__

def __getitem__(self, key): 
    try: 
     return self.var[key] 
    except KeyError: 
     return key 

表現方式與您的預期相同(注意:它不更新self.var)。你可以使用dict.get縮短它只是:

def __getitem__(self, key): 
    return self.var.get(key, key)