使用带有“非法”变量名的dict()构造函数

2024-04-26 03:18:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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文件或类似文件替换节名,因为船已经航行了很久。有什么办法可以套住重复的钥匙吗?你知道吗


Tags: 文件脚本config应用程序配置文件sectionkeyworddict
2条回答

我下面的答案将起作用,因为在处理时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'}}

您可以扩展逻辑来测试重复的参数、值对。你知道吗

相关问题 更多 >