Python:在字典和argparse.Namespace中存储设置

时间:2015-01-10 01:07:18

标签: python shell simulation argparse

我在用Python编写的科学模拟方面做了一些工作。我继承了这段代码。 sim有几个(~15-20)参数,这些参数可以在不同的运行中变化 - 主要是数值变量,加上一些布尔标志。主Python脚本将这些参数作为命令行参数,并使用argparse将它们存储在argparse.Namespace对象中。

实际上,参数值不是在命令行上输入,而是存储在shell脚本中以便于重用。除了使用相关命令行args运行Python脚本之外,这些脚本没有任何实际用途。

我希望将参数集存储在人类可读(特别是科学家可读)和Python可解析的配置文件中,并完全省去shell脚本和argparse。这样做的结果是我将参数存储在字典而不是Namespace

在字典中存储设置是否有任何缺点?除了params.spamparams['spam']更简洁的事实?

2 个答案:

答案 0 :(得分:3)

dict最终会argparse用于托管其Namespace,因此,直接使用ConfigParser没问题。

模块'foo'https://docs.python.org/2/library/configparser.html将解析一个相当普通的配置文件并将设置存储在其中。然而,它是按部分安排的。在给定填充的配置解析器对象cp

的情况下,提取单个部分adict = dict(cp.items('foo'))
{{1}}

会奏效。

为了更方便的访问语法,您可以使用http://code.activestate.com/recipes/52308-the-simple-but-handy-collector-of-a-bunch-of-named/(老人,但金币: - )......

答案 1 :(得分:0)

Ipython集成了配置文件和命令行值。有默认配置文件和用户配置文件。并且argparse参数是从配置文件创建的。因此,在多个级别设置和修改值。我必须深入研究代码,但我认为这些值最终存储在config生成的结构中,而不是argparse.Namespace

在内部,argparse使用getattrsetattr访问命名空间。允许最大限度地自由设置属性名称。 Namespace类就像它们一样简单,有几种比较和显示方法。

可以使用以下简单语句将命名空间值添加到字典中:

d.update(vars(p.parse_args()))

我考虑使用argparse.SUPPRESS将默认值保留在命名空间之外,从而防止它们更改字典中已存在的值。