Как поднять ошибку, если дублирует ключи в словаре

Я пытаюсь поднять ошибку, если пользователь вводит дубликат ключа в словаре. Словарь находится в файле, и пользователь может редактировать файл вручную.

Пример:

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

новый ключ «а» уже существует …

Как я могу проверить dico и предупредить пользователя при загрузке dico из файла?

5 Solutions collect form web for “Как поднять ошибку, если дублирует ключи в словаре”

Напишите подкласс 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') ), .... ) ) 

используя кортежи вместо dicts для импорта файла (написанный с использованием {} нотации, он будет использовать конструктор dict по умолчанию, и дубликаты исчезнут до того, как конструктор Dict когда-нибудь их получит!).

Вам понадобится пользовательский dict, который может отклонить ValueError, если ключ уже присутствует.

 class RejectingDict(dict): def __setitem__(self, k, v): if k in self.keys(): raise ValueError("Key is already present") else: return super(RejectingDict, self).__setitem__(k, v) 

Вот как это работает.

 >>> obj = RejectingDict() >>> obj[1] = True >>> obj[2] = False >>> obj {1: True, 2: False} >>> obj[1] = False Traceback (most recent call last): File "<stdin>", line 1, in <module> File "rejectingdict.py", line 4, in __setitem__ raise ValueError("Key is already present") ValueError: Key is already present 

НЕПРАВИЛЬНЫЙ ПУТЬ
ВОЗВРАЩАТЬСЯ

from x import dico не очень хорошая идея – вы разрешаете ПОЛЬЗОВАТЕЛЯ редактировать код, который затем выполняете вслепую . Вы рискуете получить простые опечатки, вызывая синтаксическую ошибку, вплоть до вредоносных вещей, таких как import os; os.system("rm whatever"); dico = {} import os; os.system("rm whatever"); dico = {} import os; os.system("rm whatever"); dico = {} .

Не поддавайтесь подклассу dict . Напишите свой собственный диктофон-загрузчик. Это не так сложно … прочитайте файл данных, проверьте перед каждой вставкой, существует ли ключ уже существует; если это произойдет, запишите сообщение об ошибке со значимыми вещами, такими как номер строки и дублирующий ключ и его значение. В конце, если были какие-то ошибки, вызовите исключение. Вы можете обнаружить, что есть существующий модуль, чтобы сделать все это … Python, поставляемый ConfigParser aka configparser, кажется, не то, что вы хотите.

Кстати, не имеет ли один «корневой» ключ на верхнем уровне довольно бессмысленно?

Поведение Python по умолчанию заключается в том, чтобы молча перезаписать дубликаты при объявлении словаря.

Вы можете создать свой собственный класс словаря, который будет проверять, был ли элемент уже в словаре, прежде чем добавлять новые элементы, а затем использовать это. Но тогда вам придется изменить свое объявление dico в этом файле на то, что позволяет дублировать, например, список кортежей.

Затем при загрузке этого файла данных вы проанализируете его в своем специальном «подклассовом» dict.

Если вы хотите, чтобы во время создания dict с повторяющимися ключами возникала ошибка, просто используйте встроенную проверку аргументов ключевого слова Python:

 > dict(a={}, a={}) SyntaxError: keyword argument repeated 

Если я чего-то не dict нет необходимости в подклассе dict .

  • Python: запись счетчика в файл csv
  • Временная сложность доступа к диктофону Python
  • Подтвердить dicts в Python
  • Как добавить несколько значений в ключ словаря в python?
  • Добавление отсутствующих ключей в словаре в Python
  • Итерация через словарь Python с помощью клавиш в отсортированном порядке
  • Python, как получить сумму чисел в списке, в котором есть строки
  • Как реализовать ассоциативный массив (не словарь) в Python?
  • Python - лучший язык программирования в мире.