в протоколе в отношении последовательности

StackOverflow https://stackoverflow.com/questions/1823752

  •  22-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top