AKK*_*KKO 5 python string dictionary replace abstract-syntax-tree
我在尝试向本身嵌套在另一个字典对象中的字典对象添加更多key:value对时遇到了一些麻烦。同样,在dict[key] = value
字典中分配额外的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)
}
}
Run Code Online (Sandbox Code Playgroud)
然后遵循这一行,我将做一个if
测试,如果通过,将要求我添加其他字典:
environment_add = { 'v' : {'LM_LICENSE_FILE' : '1800@adsc-linux'} ,
'l' : 'quartus_full' }
Run Code Online (Sandbox Code Playgroud)
最终形成这个完整的字典:
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'
}
Run Code Online (Sandbox Code Playgroud)
如您所见,如果我尝试使用dict[key] = value
语法分配一个新的key:value对,它将对我不起作用,因为它将最终为我创建一个新的key:value对,或者覆盖现有的字典对象以及嵌套在'v'
键下的key :value对。
到目前为止,为了完成字典的创建,我一直在使用以下内容:
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'}"""
Run Code Online (Sandbox Code Playgroud)
然后使用以下命令获取字典对象:
import ast
env_dict = ast.literal_eval(environment)
Run Code Online (Sandbox Code Playgroud)
可以有效地将environment
字符串转换为以新的变量名存储的字典对象env_dict
。
我的队友认为这太过分了,特别是因为稍后会在2个单独的模块中解析environment
or env_dict
对象。在第一个模块中,键-值对将被分解并重建以形成看起来像的字符串'-v SDC_PERIOD=2500s, LM_LICENSE_FILE=1800@adsc-linux'
,而在第二个模块中,嵌套在'v'
(环境/ env_dict字典对象的)键下的字典将被直接提取出来。作为参数提供给接受映射对象的函数。
因此,正如您所看到的,完成这项工作需要大量精确的解析,尽管我的方法可以达到目标,但我的团队无法接受,而且他们认为必须有一种更好的方法可以直接从environment
是字典对象而不是字符串对象。
非常感谢您学习我的详细文章,对于在此方面的任何帮助或建议,我将不胜感激!
for k,v in environment_add.iteritems(): # .items() in Python 3
if k in environment:
environment[k].update(v)
else:
environment[k] = v
Run Code Online (Sandbox Code Playgroud)
也就是说,对于要添加的每个项目,检查它是否存在,如果存在则进行更新,或者直接创建它。假设添加的项目(如果存在)将是字典(您无法更新像这样的字符串 quartus_full
)。