в протоколе относительно последовательности - PullRequest
0 голосов
/ 01 декабря 2009

Как это реализовано на уровне питона?

У меня есть объект, который в большинстве своем претендует на то, чтобы быть диктом (в ретроспективе мне следовало бы просто использовать подклассы 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

Ответы [ 2 ]

3 голосов
/ 01 декабря 2009

Звучит так, как будто вы хотите перегрузить оператор in?

Вы можете сделать это, определив метод __contains__: http://docs.python.org/reference/datamodel.html#object.contains

1 голос
/ 01 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...