в протоколе в отношении последовательности
Вопрос
Как это реализовано на уровне python?
У меня есть объект, который по большей части выдает себя за dict (оглядываясь назад, я должен был просто создать подкласс dict, но я бы предпочел не проводить рефакторинг кодовой базы, и я также хотел бы знать это для дальнейшего использования), который выглядит примерно так
class configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
Который работает точно так, как должен, и ведет себя корректно, когда я пытаюсь получить доступ к его элементам как configThingerInstance['whatever']
Но такой звонок, как
t = configThinger()
t.populate() # Internal method that fills it with some useful data
if 'DEBUG' in t:
doStuff()
приводит к возникновению KeyError, поскольку, предположительно, протокол `in' выполняет getitem получить() поиск соответствующего ключа.Нужно ли мне вызывать какое-то другое исключение, чтобы сообщить, что его там нет?Я бы предпочел не делать чего-то подобного.
try:
t['DEBUG']
except KeyError:
pass
else:
doStuff()
Кроме того, где в документации это указано?
Я оглядывался по сторонам
http://docs.python.org/tutorial/datastructures.html
http://docs.python.org/library/stdtypes.html
но, к сожалению, пытаться найти в Google что-то конкретное для слова "in" - это глупость : (
ПРАВКА 1:
С помощью стека отпечатков трассировки я вижу, что программа вызывает configThingerInstance .getitem получить(0)
однако
t = {'rawk': 1,
'rawr': 2,
}
t[0] # Raises KeyError
'thing' in t # returns False
Решение
Звучит так, как будто вы хотите перегрузить оператор in?
Вы можете сделать это, определив метод __contains__
: http://docs.python.org/reference/datamodel.html#object .содержит
Другие советы
За наилучшую поддержку для in
оператор (сдерживание, иначе называемое проверкой членства), реализует __contains__
специальный метод на вашем configThinger
класс:
class configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
def __contains__(self, key):
return key in self._config
документы являются здесь (также объясняются другие, менее эффективные способы поддержки in
оператор).