Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将dict()构造函数与";“非法”;变量名_Python_Unit Testing_Dictionary - Fatal编程技术网

Python 将dict()构造函数与";“非法”;变量名

Python 将dict()构造函数与";“非法”;变量名,python,unit-testing,dictionary,Python,Unit Testing,Dictionary,我有一个应用程序,其配置文件本身就是一个包含嵌套dict的Python脚本(我知道这不是最佳实践)。看起来有点像这样: config={'section-1': {'param1': 'value1', 'param2': 'value2'}, 'section-2': {'param3': 'value3', 'param4': 'value4'}, 'section-1': {'param5': 'value5', 'param6': 'value6'}

我有一个应用程序,其配置文件本身就是一个包含嵌套dict的Python脚本(我知道这不是最佳实践)。看起来有点像这样:

config={'section-1': {'param1': 'value1', 'param2': 'value2'},
        'section-2': {'param3': 'value3', 'param4': 'value4'},
        'section-1': {'param5': 'value5', 'param6': 'value6'}
       }
看看发生了什么,有人不小心重复了第1节!在单元测试中很难捕捉到这一点,除非我不是用Python导入文件,而是将其视为文本文件并对其进行解析。我原以为我可以使用
dict()
来创建一个相同的结构,例如

config=dict(section-1={'param1', 'value1'}, section-1={'param2': 'value2'})

重复使用
SyntaxError:keyword参数捕获此问题,但不幸的是,我实际上得到了
SyntaxError:keyword不能是表达式。没有范围用不包含
-
的节名替换节名,也没有范围用经典INI文件或类似文件替换节名,该船已经航行很久了。有什么方法可以捕获重复的键吗?

我下面的答案将无效,因为
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

遵循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'}}

您可以扩展逻辑以测试重复的参数、值对。

当应用程序加载配置文件时会发生什么?由于它是一个python文件,因此将由python解释器处理,该解释器只保留最后一个声明。我想知道为什么您的解析器必须做任何不同的事情——如果您正在创建一个测试用例来捕获这样的错误,这是有意义的……我不想让第二个
节1
覆盖第一个,因为编辑文件的人肯定会犯这样的错误。如果它处于该状态,则应该可以取消签入(我们有一个预提交触发器来运行单元测试)。如果您将其视为文本文件,则在解析之前对其进行预处理以更改问题标签的形式。您可以创建自己的自定义dict,因为
config.iteritems()
只有
section-2{'param4':'value4','param3':'value3'}第1节{'param6':'value6','param5':'value5'}