如何修改Python的'default'字典以始终返回默认值

3 投票
3 回答
6828 浏览
提问于 2025-04-15 15:16

我在用这些东西来打印数据包中分配的IANA值的名称。所以所有的字典都有一个默认值“RESERVED”。

我不想用 d.get(key,default) 这种方式,而是想通过 d[key] 来访问字典,这样如果这个键不在字典里,就能返回一个默认值(这个默认值在所有字典中都是一样的)。

我不一定非得用字典,但它们是最直观的选择……还有一个我可以这样做的字典

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

会是我最想要的解决方案。

元组也是另一种选择,但那样的话我可能会在赋值时出错……(而且我的代码就不太容易让人看懂了)

哦对了,我用的是Python 2.4。

相关问题:

3 个回答

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)
9

如果你能升级到Python 2.5版本,那么就可以使用一个叫做defaultdict的类,具体内容可以在这里找到。这个类可以让你传入一个初始化函数,这样你就能得到你想要的结果。如果不能升级的话,你可能需要自己写一个类似的功能了。

4

如果可以的话,建议你使用Mario的解决方案

如果不行,那你就需要创建一个类似字典的对象。你可以直接从“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”要慢一些。

撰写回答