Как изменить словарь Python 'default', чтобы он всегда возвращал значение по умолчанию
Я использую их все, чтобы напечатать имена назначенных значений IANA в пакете. Таким образом, все словари имеют одинаковое значение по умолчанию "зарезервировано".
Я не хочу использовать d.get(key,default), но получить доступ к словарям по d[key], так что если ключ не находится в d, он возвращает значение по умолчанию (то же самое для всех словарей).
Мне не обязательно использовать словари, но они были интуитивным выбором...
Кроме того, словарь, где я мог бы сделать это
d = {
1..16 = "RESERVED",
17 : "Foo",
18 : "Bar,
19..255: "INVALID"
}
Было бы предпочтительнее решение
Кортежи могут быть другой альтернативой, но тогда я склонен компенсировать ошибки, присваивая значения... (и мой код не будет "читаемым человеком")
О да, Python 2.4
3 ответов:
Если вы можете, используйте решение Марио.
Если вы не можете, вам просто нужно подклассировать объект, подобный словарю. Теперь вы можете сделать это, унаследовав непосредственно от "Дикта", это будет быстро и эффективно. Для старых версий Python, с которыми вы не можете наследовать от "dict", существует "UserDict", чистая реализация словаря Python.
С ним вы сделали бы это следующим образом:
#!/usr/bin/env python # -*- coding= UTF-8 -*- import UserDict class DefaultDict(UserDict.UserDict) : default_value = 'RESERVED' def __getitem__(self, key) : return self.data.get(key, DefaultDict.default_value) d = DefaultDict() d["yes"] = True; print d["yes"] print d["no"]Имейте в виду, что "UserDict" медленнее, чем "dict".
Если вы можете перейти на Python 2.5, существует классdefaultdict , как показаноздесь . Вы можете передать ему инициализатор, который возвращает то, что вы хотите. В противном случае, боюсь, вам придется свернуть свою собственную реализацию этого.
Можно использовать следующий класс (тестируется в Python 2.7) Просто измените ноль на любое значение по умолчанию, которое вам нравится.
class cDefaultDict(dict): # dictionary that returns zero for missing keys # keys with zero values are not stored def __missing__(self,key): return 0 def __setitem__(self, key, value): if value==0: if key in self: # returns zero anyway, so no need to store it del self[key] else: dict.__setitem__(self, key, value)
Comments