python - 如果字典中的键重复,如何引发错误

标签 python dictionary duplicates

如果用户在字典中输入重复键,我会尝试引发错误。词典在一个文件中,用户可以手动编辑该文件。

例子:

dico= {'root':{
                'a':{'some_key':'value',...},
                'b':{'some_key':'value',...},
                'c':{'some_key':'value',...},
                ...

                'a':{'some_key':'value',...},
              }
      }

新键'a'已经存在...

如何测试 dico 并在从文件加载 dico 时警告用户?

最佳答案

写一个dict的子类,覆盖__setitem__,这样它在替换现有键时抛出错误;重写文件以使用新子类的构造函数而不是默认的 dict 内置函数。

import collections

class Dict(dict):
    def __init__(self, inp=None):
        if isinstance(inp,dict):
            super(Dict,self).__init__(inp)
        else:
            super(Dict,self).__init__()
            if isinstance(inp, (collections.Mapping, collections.Iterable)): 
                si = self.__setitem__
                for k,v in inp:
                    si(k,v)

    def __setitem__(self, k, v):
        try:
            self.__getitem__(k)
            raise ValueError("duplicate key '{0}' found".format(k))
        except KeyError:
            super(Dict,self).__setitem__(k,v)

那么你的文件必须写成

dico = Dict(
    ('root', Dict(
        ('a', Dict(
            ('some_key', 'value'),
            ('another_key', 'another_value')
        ),
        ('b', Dict(
            ('some_key', 'value')
        ),
        ('c', Dict(
            ('some_key', 'value'),
            ('another_key', 'another_value')
        ),

        ....
    )
)

使用元组而不是字典进行文件导入(使用 {} 符号编写,它将使用默认的字典构造函数,并且重复项会在字典构造函数获取它们之前消失!)。

关于python - 如果字典中的键重复,如何引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4999233/

相关文章:

python - 交换字典中的两个随机值

python - 嵌套字典理解 : Too many values to unpack

javascript - 使用 JavaScript 挑选不重复的随机数

python - PLY:需要帮助理解 LALR 解析器如何解析给定语法的输入

python - Django 有办法打开 HTTP 长轮询连接吗?

python - 仅转换一个具有字典理解的项目

delphi - 如何快速删除列表框中的重复项?

sql - 从 SQL 表中删除重复行(基于多列中的值)

python - 将 python 2 检查哈希转换为 python 3

python - 如何从 Fabric 中的终端命令行为多个主机提供 ssh key