Как это реализовано на уровне python?в протоколе относительно последовательности
У меня есть объект, который по большей части претендует на правду (в ретроспективе я должен был просто подклассифицировать dict, но я бы предпочел не рефакторировать базу кода, и я также хотел бы знать это для будущая ссылка), которая выглядит немного как
class configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
который работает точно так же, как это предполагается, и ведет себя правильно, когда я пытаюсь получить доступ к его элементам как configThingerInstance [ «независимо от»]
Но вызов, как
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 что-то конкретное, чтобы слово 'в' Глупо :(
EDIT 1:
С стеком следов отпечатков, я вижу, что программа вызывает configThingerInstance. GetItem (0)
однако
t = {'rawk': 1,
'rawr': 2,
}
t[0] # Raises KeyError
'thing' in t # returns False
@Richo, то, что вы наблюдаете, является отчаянной попыткой последней попытки для типов, которые не определяют ни '__contain__', ни' __iter__' (он пытается увидеть, могут ли они, правда, быть итерабельными, бояться говорить это имя; -). –
У меня была догадка, вот что это такое, в котором я начал искать документы, а затем спрашивал здесь, а не размышлять о попытке найти какой-нибудь пасхальный яйцо, оставшееся от Гуидо, лежащее около;) – richo