Как это реализовано на уровне питона?
У меня есть объект, который в большинстве своем претендует на то, чтобы быть диктом (в ретроспективе мне следовало бы просто использовать подклассы dict, но я бы не стал рефакторировать кодовую базу, и я также хотел бы знать это в будущем ссылка), которая выглядит примерно как
class configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
, который работает точно так, как он должен, и ведет себя правильно, когда я пытаюсь получить доступ к его элементам как configThingerInstance ['what' ']
Но звонок как
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
но трагически пытаться гуглить что-то специфическое для слова «в» - глупость: (
РЕДАКТИРОВАТЬ 1:
Имея стопку отпечатков трасс, я вижу, что программа вызывает configThingerInstance. getitem (0)
однако
t = {'rawk': 1,
'rawr': 2,
}
t[0] # Raises KeyError
'thing' in t # returns False