2016-11-11 8 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__ полезным только для классов, расширяющих dict. В моем случае это не имеет смысла, и я должен просто реализовать недостающую функциональность внутри try/except.

Есть ли способ сделать __getitem__ автоматически называть __missing__ на KeyError?

+0

Похоже, что это применимо только на подклассах Словаря 'Если подкласс Словаря определяет метод __missing__' – Falmarri

+0

Вы можете просто определить класс подмешать с желаемым поведением для '' __getitem__'' – Zah

+0

'__missing__' не является общим", что происходит, когда '__getitem__' не работает". Это именно то, что ищет 'dict .__ getitem__', и его реализация имеет смысл только для подклассов' dict'. – user2357112

ответ

4

Per the docs:

object.__missing__(self, key)

Вызывается dict.__getitem__() реализовать self[key] для Dict подклассов, когда ключ отсутствует в словаре.

В принципе, если вы не 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^