栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

子类化Python字典以覆盖__setitem__

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

子类化Python字典以覆盖__setitem__

我正在回答我自己的问题,因为我最终决定我确实 确实
想对Dict进行子类化,而不是创建一个新的映射类,并且UserDict在某些情况下仍然遵循基础的Dict对象,而不是使用提供的

__setitem__

阅读和重新阅读了Python 2.6.4源之后(主要是

Objects/dictobject.c
,但我grepped
eveywhere别的,看看那里的各种方法的使用,)我的理解是,下面的代码
足以让我的__setitem__叫每一个对象是时间更改,并以其他方式完全像Python Dict:

彼得·汉森(Peter
Hansen)的建议让我更加仔细地研究

dictobject.c
,并且我意识到原始答案中的update方法可以稍微简化一点,因为内置字典构造函数无论如何都只是调用内置update方法。因此,我的回答中的第二次更新已添加到下面的代码中(由一些乐于助人的人;-)。

class MyUpdateDict(dict):    def __init__(self, *args, **kwargs):        self.update(*args, **kwargs)    def __setitem__(self, key, value):        # optional processing here        super(MyUpdateDict, self).__setitem__(key, value)    def update(self, *args, **kwargs):        if args: if len(args) > 1:     raise TypeError("update expected at most 1 arguments, "          "got %d" % len(args)) other = dict(args[0]) for key in other:     self[key] = other[key]        for key in kwargs: self[key] = kwargs[key]    def setdefault(self, key, value=None):        if key not in self: self[key] = value        return self[key]

我已经用以下代码对其进行了测试:

def test_updates(dictish):    dictish['abc'] = 123    dictish.update({'def': 234})    dictish.update(red=1, blue=2)    dictish.update([('orange', 3), ('green',4)])    dictish.update({'hello': 'kitty'}, black='white')    dictish.update({'yellow': 5}, yellow=6)    dictish.setdefault('brown',7)    dictish.setdefault('pink')    try:        dictish.update({'gold': 8}, [('purple', 9)], silver=10)    except TypeError:        pass    else:        raise RunTimeException("Error did not occur as planned")python_dict = dict([('b',2),('c',3)],a=1)test_updates(python_dict)my_dict = MyUpdateDict([('b',2),('c',3)],a=1)test_updates(my_dict)

它通过了。我尝试过的所有其他实现在某些时候都失败了。我仍然会接受任何表明我错过了某些东西的答案,但是否则,我将在几天之内在其旁边打勾,并称其为正确的答案:)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/640821.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号