Записать подкласс dict, переопределить __setitem__ так, чтобы он выдавал ошибку при замене существующего ключа; перепишите файл, чтобы использовать конструктор вашего нового подкласса вместо встроенных модулей по умолчанию.
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 их получит!).