Как поднять пользовательский словарь сообщения KeyError - PullRequest
4 голосов
/ 17 октября 2011

Я пишу несколько скриптов, которые будут использоваться не-python-пользователями.У меня есть класс Config, в котором есть словари, и я хотел бы иметь возможность вызывать пользовательское исключение для KeyError.Есть ли элегантный способ сделать это, кроме написания метода, который вызывает исключение при проверке значения в словаре?

Вот пример:

class ConfigError(Exception): pass

class Config:
    def __init__(self):
        self.cars = {'BMW': 'M5', 'Honda': 'Civic'}

    def get_car(self, name):
        try:
            return self.cars[name]
        except KeyError, e:
            raise ConfigError("Car %s doesn't exist!!!" % name)

conf = Config()
print 'Car: %s' % conf.cars['BMW']
print 'Car: %s' % conf.cars['Mercedes']

Вот вывод:

Car: M5 
Traceback (most recent call last):
  File "test.py", line 17, in ?
    print 'Car: %s ' % conf.cars['Mercedes']
KeyError: 'Mercedes'

Я знаю, что могу написать метод, подобный Config.get_car () выше, и вызвать пользовательскийисключение, но я хотел бы иметь возможность вызывать пользовательское исключение при прямой попытке доступа к словарю Config.cars.Я хотел бы сделать это, потому что на самом деле в конфиге больше словарей, но мне нужно только создать пользовательское исключение для одного из словарей, и я хотел бы сохранить постоянство доступа к данным (все как словари).

Примечание: это использует Python 2.4.4

1 Ответ

5 голосов
/ 17 октября 2011

Подумайте об этом.

class MyConfigDict( dict ):
    def __getitem__( self, key ):
        try:
            return super( MyConfigDict, self ).__getitem__( key )
        except KeyError as e:
            raise MyConfigError( e.message )

Нечто подобное может позволить вам обернуть каждый доступ в ваше собственное расширенное исключение.

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