2009-10-22 2 views
3

Я использую все для печати имен назначенных значений IANA в пакете. Таким образом, все словари имеют одинаковое значение по умолчанию «RESERVED».Как изменить словарь Python по умолчанию, чтобы он всегда возвращал значение по умолчанию

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

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

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

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

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

О да, Python 2.4

ответ

4

Если вы можете, используйте Mario's solution.

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

+0

Я должен пойти с этим подходом (похоже, что 2.4 может включать в себя dict, поэтому я не полностью потерял) ... Однако теперь я начал задаваться вопросом, можно ли создать класс, подобный словарю, который позволил назначать «диапазон». – Kimvais

+0

Что вы подразумеваете под назначением диапазона? –

+1

Это должно быть 'self.default_value', поэтому он корректно работает с подклассом. – habnabit

9

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

+0

Если обновление был вариант, я бы на 3.0 вообще, к сожалению, я думаю, что я застрял с 2.4, так что я могу запустить это на EL5 без установки нового питона ... – Kimvais

+0

Существует defaultdict backport http://code.activestate.com/recipes/523034/ –

+0

И очень чистый. Довольно интересно понять реализацию defaultdict. –

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^