2009-12-01 4 views
0

Как это реализовано на уровне 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 
+0

@Richo, то, что вы наблюдаете, является отчаянной попыткой последней попытки для типов, которые не определяют ни '__contain__', ни' __iter__' (он пытается увидеть, могут ли они, правда, быть итерабельными, бояться говорить это имя; -). –

+0

У меня была догадка, вот что это такое, в котором я начал искать документы, а затем спрашивал здесь, а не размышлять о попытке найти какой-нибудь пасхальный яйцо, оставшееся от Гуидо, лежащее около;) – richo

ответ

1

Для лучшей поддержки (членство сдерживания аки проверки) 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 

Документы: here (также объясняет другие, более низкие способы поддержки оператора in).

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