【发布时间】:2015-10-05 08:20:35
【问题描述】:
我正在尝试寻找一种优雅的方式将存储在 YAML 文件中的值加载到我的 __init__ 函数中,用于多个类。如果我有一个包含以下内容的 YAML 文件:
#YAML
an_object:
var_a: 1
var_b: 2
使用以下模块:
class SomeClass(object):
def __init__(self, var_a=10, var_b=20, var_c=30):
self.var_a = var_a
self.var_b = var_b
self.var_c = var_c
我想使用 YAML 文件中的值(如果存在),否则使用 __init__ 方法默认值(如果不存在)。我还希望它可以扩展到许多变量 (>10),所以我不想尝试/排除每个参数。
我的第一反应是:
import yaml
class SomeClass(object):
def __init__(self, var_a=10, var_b=20, var_c=30):
self.var_a = var_a
self.var_b = var_b
self.var_c = var_c
with open('config.yaml','r') as stream:
cfg = yaml.load(stream)['an_object']
for key, value in cfg.iteritems():
if hasattr(self, key):
exec("self.{} = {}".format(key, value))
但我宁愿不必使用exec,也不想分配变量两次(这有点令人困惑)。有一个更好的方法吗?它还会覆盖非默认函数值,我也不想这样做。
【问题讨论】:
-
你不需要使用
exec,你可以使用setattr(self, key, value)。
标签: python configuration yaml pyyaml