如何在字典中重复键时提高错误 [英] How to raise error if duplicates keys in dictionary

查看:104
本文介绍了如何在字典中重复键时提高错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I try to raise an error if the user enter a duplicate key in a dictionary. The dictionary is in a file and the user can edit the file manually.

示例:

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

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

新密钥'a'已经存在...

the new key 'a' already exist...

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

How can I test dico and warn the user when I load dico from the file?

推荐答案

编写dict的子类,覆盖__setitem__,以便在替换现有密钥时引发错误;重写文件以使用您的新子类的构造函数而不是默认的dict内置。

Write a subclass of dict, override __setitem__ such that it throws an error when replacing an existing key; rewrite the file to use your new subclass's constructor instead of the default dict built-ins.

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')
        ),

        ....
    )
)

使用元组代替文件导入的dict(使用{}符号编写,它将使用默认的dict构造函数,并且重复的将在Dict构造函数获取它们之前消失!)。

using tuples instead of dicts for the file import (written using the {} notation, it would use the default dict constructor, and the duplicates would disappear before the Dict constructor ever gets them!).

这篇关于如何在字典中重复键时提高错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆