我们有一个类似于这样的
在另一个类(或另一个Python文件)中,我需要做同样的事情:
config.yaml
文件:darwin:
installer:
title: "%(product_name)s %(version)s"
filename: "%(brand_name)s-%(version)s"
还有一个格式化它的功能:
def format_context(config):
return {
"company_name": config['company_name'],
"product_name": config['product_name'],
"brand_name": config['brand_name'],
"title": config['darwin']['installer']['title'],
"filename": config['darwin']['installer']['filename'],
}
这里的目标是我们可以将值作为格式化字符串输入。
现在我需要将format_context
返回的字典转换为变量。
第一次尝试使用locals()
:
context = format_context(config)
for k, v in context.iteritems():
locals()[k] = str(v) % context
也许是由于顺序的原因,有时我会遇到KeyError
错误。此外,从Python文档中可以看出:
注意:不应修改该字典的内容;更改可能不会影响解释器使用的局部和自由变量的值。
因此,我转而使用exec
:
context = format_context(config)
for k, v in context.iteritems():
exec("%s = '%s'" % (k, str(v) % context))
它能够工作,但我想知道这是否是一个好的方法?
请让我澄清一下为什么我要从那个字典中创建变量。
我有一个函数来解析这个config.yaml
文件:
class BrandConfiguration(object):
"""
A brand configuration (directory)
"""
def __init__(self, directory):
self.dirname = directory
@property
def config(self):
"""
return configuration for a single brand
"""
with open(os.path.join(self.dirname, "config.yaml")) as fh:
return yaml.load(fh)
然后在一个类中,我定义了一些变量:
- brand_config = self.brand_config_instance.config
- binary_name = brand_config['binary_name']
- major_version = brand_config['version']['major']
- minor_version = brand_config['version']['minor']
- patch_version = brand_config['version']['patch']
在另一个类(或另一个Python文件)中,我需要做同样的事情:
- brand_name, binary_name = config['brand_name'], config['binary_name']
- identifiers = [binary_name] + brand_name.split('.')
- identifiers.reverse()
- identifier = '.'.join(identifiers)
- major_version = config['version']['major']
- minor_version = config['version']['minor']
- patch_version = config['version']['patch']
- version = '.'.join(
- (
- str(major_version),
- str(minor_version),
- str(patch_version),
- build_number
- )
- )
由于我不想复制代码,我正在尝试将所有代码存储在字典中并转换为变量。
您试图从format_context返回的字典中使用值的位置/方式是什么?
假设在 config.yaml
中,您有类似以下内容:
version:
major: 1
minor: 0
patch: 0
在为 Windows 添加元数据时,不要创建一些变量:
- brand_name, binary_name = config['brand_name'], config['binary_name']
- identifiers = [binary_name] + brand_name.split('.')
- identifiers.reverse()
- identifier = '.'.join(identifiers)
- major_version = config['version']['major']
- minor_version = config['version']['minor']
- patch_version = config['version']['patch']
- version = '.'.join(
- (
- str(major_version),
- str(minor_version),
- str(patch_version),
- build_number
- )
- )
现在我可以直接使用它:
json_data['FixedFileInfo']['FileVersion']['Major'] = major_version
json_data['FixedFileInfo']['FileVersion']['Minor'] = minor_version
json_data['FixedFileInfo']['FileVersion']['Patch'] = patch_version
json_data['FixedFileInfo']['FileVersion']['Build'] = build_number
json_data['FixedFileInfo']['ProductVersion'] = \
json_data['FixedFileInfo']['FileVersion']
json_data['StringFileInfo']['CompanyName'] = company_name
json_data['StringFileInfo']['FileDescription'] = service_description
json_data['StringFileInfo']['LegalCopyright'] = legal_copyright
json_data['StringFileInfo']['ProductName'] = product_name
json_data['StringFileInfo']['ProductVersion'] = '.'.join(
(
str(major_version),
str(minor_version),
str(patch_version),
self.target.build_number
)
)
%(...)s
表达式,只需将formatted_yaml = raw_yaml % format_context(config)
设置即可。 - larsksconfig.yaml
文件中设置一些常见变量,而且我不想重复代码。我更新了我的原始问题以澄清。现在更清楚了吗? - quantaBrandConfiguration
类似乎没有进行任何模板化。你在哪里/如何使用format_context
返回的字典中的值?我强烈怀疑在这里使用locals()
是错误的解决方案,但由于我不清楚你想要实现什么,所以我不确定能否提供更好的解决方案。 - larsks**kwargs
将字典传递进去即可。 - hpaulj