Как изменить словарь Python 'default', чтобы он всегда возвращал значение по умолчанию



Я использую их все, чтобы напечатать имена назначенных значений IANA в пакете. Таким образом, все словари имеют одинаковое значение по умолчанию "зарезервировано".



Я не хочу использовать d.get(key,default), но получить доступ к словарям по d[key], так что если ключ не находится в d, он возвращает значение по умолчанию (то же самое для всех словарей).



Мне не обязательно использовать словари, но они были интуитивным выбором...
Кроме того, словарь, где я мог бы сделать это

d = {
1..16 = "RESERVED",
17 : "Foo",
18 : "Bar,
19..255: "INVALID"
}


Было бы предпочтительнее решение



Кортежи могут быть другой альтернативой, но тогда я склонен компенсировать ошибки, присваивая значения... (и мой код не будет "читаемым человеком")



О да, Python 2.4

549   3  

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

    Ничего не найдено.