尝试通过添加更多键:值对来扩展嵌套字典

时间:2014-11-10 08:17:25

标签: python string dictionary replace abstract-syntax-tree

我在尝试向字体对象添加更多键:值对时遇到了一些麻烦,该字典对象本身嵌套在另一个字典对象中。此外,通常的方式dict[key] = value为字典分配额外的键:值对不适合我的情况(我将在下面解释原因),因此这使我的目标更多难以实现。

我将通过源代码中的一些陈述来说明我尝试实现的目标。

首先,我有一个包含嵌套的字典对象:

environment = { 'v' : 
                  {
                   'SDC_PERIOD':'{period}s'.format(period = self.period),
                   'FAMILY':'{legup_family}s'.format(legup_family = self.legup_family),
                   'DEVICE_FAMILY':'"{fpga_family}s"'.format(fpga_family = self.fpga_family)
                   }
              }

然后按照这一行,我将进行if测试,如果通过,将要求我添加其他字典:

environment_add = { 'v' : {'LM_LICENSE_FILE' : '1800@adsc-linux'} , 
                    'l' : 'quartus_full' }

最终形成这个完整的词典:

environment = { 'v' : 
                  {
                   'SDC_PERIOD':'{period}s'.format(period = self.period),
                   'FAMILY':'{legup_family}s'.format(legup_family = self.legup_family),
                   'DEVICE_FAMILY':'"{fpga_family}s"'.format(fpga_family = self.fpga_family),
                   'LM_LICENSE_FILE' : '1800@adsc-linux'
                   } ,
                'l' : 'quartus_full'
              }

正如您所看到的,如果我尝试使用dict[key] = value语法分配新的键:值对,它对我来说不起作用,因为它最终会创建一个新的键:值对我,或覆盖现有的字典对象和嵌套在'v'键下的键:值对。

到目前为止,为了完成字典的创建,我一直在使用以下内容:

environment = """{ v: {'SDC_PERIOD':'%(period)s','FAMILY':'%(legup_family)s','DEVICE_FAMILY':'"%(fpga_family)s"'}}""" % self
if self.require_license:  # this is the if statement test that I was referring to earlier
  environment = environment.replace('}', '')
  environment += """ ,'LM_LICENSE_FILE':'1800@adsc-linux'}, 'l': 'quartus_full'}"""

然后使用以下方法获取字典对象:

import ast
env_dict = ast.literal_eval(environment)

,它有效地将environment字符串转换为存储在新变量名env_dict下的字典对象。

我的队友认为这太过分了,特别是因为environmentenv_dict对象将在稍后的2个单独的模块中解析。在第一个模块中,键值对将被分解并重建以形成看起来像'-v SDC_PERIOD=2500s, LM_LICENSE_FILE=1800@adsc-linux'的字符串,而在第二个模块中,字典嵌套在'v'键下(环境/ env_dict字典对象)将被提取出来并直接作为参数提供给接受映射对象的函数。

正如您所看到的,完成这项工作需要进行大量精确的解析,虽然我的方法实现了目标,但我的团队并未接受它,他们认为必须有更好的方法这直接来自environment是一个字典对象,而不是一个字符串对象。

非常感谢您研究我的详细信息,我将非常感谢您提出任何帮助或建议!

2 个答案:

答案 0 :(得分:5)

for k,v in environment_add.iteritems(): # .items() in Python 3
    if k in environment:
        environment[k].update(v)
    else:
        environment[k] = v

也就是说,对于要添加的每个项目,检查它是否存在,如果是,则更新它,或者只是创建它。这假定添加的项目(如果存在)将是dicts(您无法更新quartus_full之类的字符串。)

答案 1 :(得分:2)

为什么不使用更新

In [4]: dict_ = {"a": {"b": 2, "c": 3}}

In [5]: dict_["a"].update(d=4)

In [6]: dict_
Out[6]: {'a': {'b': 2, 'c': 3, 'd': 4}}