【发布时间】:2018-10-21 06:27:35
【问题描述】:
问题陈述
我希望 python 模块中支持的选项可以被 .yaml 文件覆盖,因为在某些情况下,需要使用非默认值指定的选项太多。
我实现的逻辑如下。
parser = argparse.ArgumentParser()
# some parser.add statements that comes with default values
parser.add_argument("--config_path", default=None, type=str,
help="A yaml file for overriding parameters specification in this module.")
args = parser.parse_args()
# Override parameters
if args.config_path is not None:
with open(args.config_path, "r") as f:
yml_config = yaml.safe_load(f)
for k, v in yml_config.items():
if k in args.__dict__:
args.__dict__[k] = v
else:
sys.stderr.write("Ignored unknown parameter {} in yaml.\n".format(k))
问题是,对于某些选项,我有特定的函数/lambda 表达式来转换输入字符串,例如:
parser.add_argument("--tokens", type=lambda x: x.split(","))
为了在 YAML 中解析选项规范时应用相应的功能,添加这么多 if 语句似乎不是一个好的解决方案。在parser 对象中引入新选项时,维护一个相应更改的字典似乎是多余的。是否有任何解决方案可以为parser 对象中的每个参数获取type?
【问题讨论】:
-
您还可以使用
action参数定义自己的操作传递给add_argument,这些操作比您可以使用type执行的操作更强大,您可能想研究一下。您可以以相同的方式查找并应用这些从 YAML 文件中获取的值。
标签: python-3.x yaml parameter-passing