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

覆盖子类中的dict.update()方法以防止覆盖dict键

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

覆盖子类中的dict.update()方法以防止覆盖dict键

请注意,根据文档:

  • dict.update
    接受一个
    other
    参数, “另一个字典对象或键/值对的可迭代” (我已经
    collections.Mapping
    对此进行过测试)和 “如果指定了关键字参数,则使用这些键/值对更新字典” ;和
  • dict()
    需要一个
    Mapping
    或一个
    Iterable
    可选
    **kwargs
    (与
    update
    接受…相同)。

这不是您已经实现的接口,这会导致一些问题。我将实现如下:

from collections import Mappingclass DuplicateKeyError(KeyError):    passclass UniqueKeyDict(dict):    def __init__(self, other=None, **kwargs):        super().__init__()        self.update(other, **kwargs)    def __setitem__(self, key, value):        if key in self: msg = 'key {!r} already exists with value {!r}' raise DuplicateKeyError(msg.format(key, self[key]))        super().__setitem__(key, value)    def update(self, other=None, **kwargs):        if other is not None: for k, v in other.items() if isinstance(other, Mapping) else other:     self[k] = v        for k, v in kwargs.items(): self[k] = v

正在使用:

>>> UniqueKeyDict((k, v) for k, v in ('a1', 'b2', 'c3', 'd4')){'c': '3', 'd': '4', 'a': '1', 'b': '2'}>>> UniqueKeyDict((k, v) for k, v in ('a1', 'b2', 'c3', 'a4'))Traceback (most recent call last):  File "<pyshell#8>", line 1, in <module>    UniqueKeyDict((k, v) for k, v in ('a1', 'b2', 'c3', 'a4'))  File "<pyshell#7>", line 5, in __init__    self.update(other, **kwargs)  File "<pyshell#7>", line 15, in update    self[k] = v  File "<pyshell#7>", line 10, in __setitem__    raise DuplicateKeyError(msg.format(key, self[key]))DuplicateKeyError: "key 'a' already exists with value '1'"

和:

>>> ukd = UniqueKeyDict((k, v) for k, v in ('a1', 'b2', 'c3', 'd4'))>>> ukd.update((k, v) for k, v in ('e5', 'f6'))  # single Iterable>>> ukd.update({'h': 8}, g='7')  # single Mapping plus keyword args>>> ukd{'e': '5', 'f': '6', 'a': '1', 'd': '4', 'c': '3', 'h': 8, 'b': '2', 'g': '7'}

如果您最终使用过此功能,则我倾向于给它一个不同的名称

__repr__
以避免混淆!



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

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

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