我在用Python编写的科学模拟方面做了一些工作。我继承了这段代码。 sim有几个(~15-20)参数,这些参数可以在不同的运行中变化 - 主要是数值变量,加上一些布尔标志。主Python脚本将这些参数作为命令行参数,并使用argparse
将它们存储在argparse.Namespace
对象中。
实际上,参数值不是在命令行上输入,而是存储在shell脚本中以便于重用。除了使用相关命令行args运行Python脚本之外,这些脚本没有任何实际用途。
我希望将参数集存储在人类可读(特别是科学家可读)和Python可解析的配置文件中,并完全省去shell脚本和argparse
。这样做的结果是我将参数存储在字典而不是Namespace
。
在字典中存储设置是否有任何缺点?除了params.spam
比params['spam']
更简洁的事实?
答案 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
使用getattr
和setattr
访问命名空间。允许最大限度地自由设置属性名称。 Namespace类就像它们一样简单,有几种比较和显示方法。
可以使用以下简单语句将命名空间值添加到字典中:
d.update(vars(p.parse_args()))
我考虑使用argparse.SUPPRESS
将默认值保留在命名空间之外,从而防止它们更改字典中已存在的值。