使用dict()构造函数和"非法"变量名

时间:2014-11-25 23:17:00

标签: python unit-testing dictionary

我有一个应用程序,其配置文件本身就是一个包含嵌套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文件或类似文件替换它,该文件已经长期航行。有什么方法可以捕获重复的密钥吗?

2 个答案:

答案 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