Как изменить словарь Python по умолчанию, чтобы он всегда возвращал значение по умолчанию - PullRequest
3 голосов
/ 22 октября 2009

Я использую их все для печати имен назначенных значений IANA в пакете. Таким образом, все словари имеют одинаковое значение по умолчанию «ЗАБРОНИРОВАНО».

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

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

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

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

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

О да, Python 2.4

Ответы [ 3 ]

9 голосов
/ 22 октября 2009

Если вы можете перейти на Python 2.5, существует класс defaultdict , как показано здесь . Вы можете передать ему инициализатор, который возвращает то, что вы хотите. Боюсь, в противном случае вам придется свернуть свою реализацию.

4 голосов
/ 22 октября 2009

Если можете, используйте раствор Марио .

Если вы не можете, вам просто нужно создать подкласс словоподобного объекта. Теперь вы можете сделать это, унаследовав непосредственно от «dict», это будет быстро и эффективно. Для старых версий 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».

0 голосов
/ 30 апреля 2014

Вы можете использовать следующий класс (протестировано в 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)
...