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

Python: storing settings in dictionary vs argparse.Namespace

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

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

我想将参数集存储在人类可读(特别是科学家可读)和 Python 可解析的配置文件中,并免除 shell 脚本和 argparse 一共。这样做的结果是我会将参数存储在字典中而不是 Namespace.

将设置存储在字典中有什么缺点吗?除了 params.spamparams['spam']?

稍微简洁一点

dictargparse 最终用于承载其 Namespace 的,因此,直接使用一个没问题。

Module ConfigParser, https://docs.python.org/2/library/configparser.html ,将解析一个相当正常的配置文件并为您存储设置。但是,它是按部分排列的。要提取单个部分 'foo',给定填充的配置解析器对象 cp

adict = dict(cp.items('foo'))

会起作用。

为了更容易访问语法,您可以使用 http://code.activestate.com/recipes/52308-the-simple-but-handy-collector-of-a-bunch-of-named/(一个老歌但金曲:-)...

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

在内部,argparse 使用 getattrsetattr 访问命名空间。允许最大程度地自由设置属性名称。命名空间 class 非常简单,有一些比较和显示的方法。

命名空间值可以通过如下简单语句添加到字典中:

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

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