我有一个应用程序,其配置文件本身就是一个包含嵌套dicts字典的Python脚本(我知道这不是最佳实践)。它看起来像这样:
config={'section-1': {'param1': 'value1', 'param2': 'value2'},
'section-2': {'param3': 'value3', 'param4': 'value4'},
'section-1': {'param5': 'value5', 'param6': 'value6'}
}
看看那里发生了什么,有人不小心重复section-1
!这很难陷入单元测试,除非不是用Python导入文件,而是将其视为文本文件并解析它。我以为我可以使用dict()
来创建一个相同的结构,例如
config=dict(section-1={'param1', 'value1'}, section-1={'param2': 'value2'})
使用SyntaxError: keyword argument repeated
捕获此问题,但遗憾的是我实际上得到SyntaxError: keyword can't be an expression
。没有范围可以用不包含-
的部分名称替换部分名称,也不能用经典的INI文件或类似文件替换它,该文件已经长期航行。有什么方法可以捕获重复的密钥吗?
答案 0 :(得分:1)
遵循davidc所说:"将其视为文本文件,在解析之前对其进行预处理以更改问题标签的形式",这适用于您的示例......
from ast import literal_eval
from collections import defaultdict
config = '''{'section-1': {'param1': 'value1', 'param2': 'value2'},
'section-2': {'param3': 'value3', 'param4': 'value4'},
'section-1': {'param5': 'value5', 'param6': 'value6'},
'section-1': {'param7': 'value7', 'param8': 'value8'}
}'''
cfg=config.replace('{','[').replace('}',']').replace(
' ','').replace('[','[(').replace(']',')]').replace(
',','),(').replace(':',',').replace('\n','')
parsed_config = {}
keys = defaultdict(int)
for s, d in literal_eval(cfg):
if s in parsed_config:
keys[s] += 1
parsed_config[s+'('+str(keys[s])+')'] = dict(d)
else:
parsed_config[s] = dict(d)
print(parsed_config)
# {'section-1(2)': {'param7': 'value7', 'param8': 'value8'},
# 'section-2': {'param4': 'value4', 'param3': 'value3'},
# 'section-1': {'param2': 'value2', 'param1': 'value1'},
# 'section-1(1)': {'param6': 'value6', 'param5': 'value5'}}
您可以扩展逻辑以测试重复的参数,值对。
答案 1 :(得分:0)
我在下面的回答是 不 ,因为config
在处理时不会同时存在这两个值!无论如何,我会在这里留下我的答案。
一个选项是创建另一个dict,你将从dict转储键:
new_config = {}
for k, v in config.iteritems():
if k in new_config:
print 'Error: Overwriting key %s' % k
sys.exit()
new_config[k] = v