PyPy 的配置处理

由于越来越多的配置选项可用,将必要的选项传递到实际使用它们的地方变得非常烦人,添加新选项更是如此。为了解决这些问题,引入了配置管理。所有必要的选项都存储在一个配置对象中,该对象在 RPython 工具链 和标准解释器中几乎随处可见,因此添加新选项变得轻而易举。选项被组织成树状结构。配置对象可以通过不同的方式创建,支持自动创建 optparse 命令行解析器。

主要假设

配置对象在入口点生成,并向下传递到实际使用它们的地方。这使配置保持本地化,但同时在任何地方都可用且一致。配置值使用命令行创建。

API 细节

选项处理分为两部分:描述哪些选项可用、它们可能的取值和默认值,以及它们如何组织成树状结构。特定选项的选择被捆绑到一个配置对象中,该对象引用其选项描述(因此确保配置值符合选项描述)。这种拆分与 rtyper 类型系统中类型和实例之间的区别非常相似:类型描述了实例具有哪些字段。

选项被组织成树状结构。每个选项都有一个名称,每个选项组也有一个名称。选项完整名称的各个部分用点号分隔:例如 config.translation.thread

选项描述

所有构造函数都以 namedoc 参数作为第一个参数,为选项或选项组命名并对其进行文档化。大多数构造函数都接受一个 default 参数,用于指定选项的默认值。如果未提供此参数,则默认值为 None。大多数构造函数还接受一个 cmdline 参数,您可以在其中指定命令行选项的外观(例如 cmdline=”-v –version”)。如果未指定 cmdline,则会创建一个默认的命令行选项,该选项使用选项的名称及其完整路径。如果将 None 作为 cmdline 传递,则根本不会创建命令行选项。

某些选项类型可以指定要求,以指定一个选项的特定选择仅在另一个选项的特定选择使用时才有效。要求使用一对列表来指定。对的第一个元素给出需要设置的选项的路径,第二个元素给出所需的值。

OptionDescription

此类用于对子选项进行分组。

__init__(self, name, doc, children)
children 是一个选项描述列表(包括用于嵌套命名空间的 OptionDescription 实例)。

ChoiceOption

表示从多个对象中进行选择。该选项也可以具有值 None

__init__(self, name, doc, values, default=None, requires=None, cmdline=DEFAULT)
values 是一个选项可能取值的列表,requires 是一个字典,将值映射到由两个元素组成的元组列表。

BoolOption

表示在 TrueFalse 之间进行选择。

__init__(self, name, doc, default=None, requires=None, suggests=None, cmdline=DEFAULT, negation=True)
default 指定选项的默认值。 requires 是一个由两个元素组成的元组列表,描述了将选项设置为 true 时的要求,suggests 是一个具有相同结构的列表,但其中的选项只是建议,并非绝对必要。区别很小:如果当前选项设置为 True,则设置了所需选项和建议选项。但是,所需选项不能在以后更改。 negation 指定是否应生成负命令行选项。

IntOption

表示对整数的选择。

__init__(self, name, doc, default=None, cmdline=DEFAULT)

FloatOption

表示对浮点数的选择。

__init__(self, name, doc, default=None, cmdline=DEFAULT)

StrOption

表示对字符串的选择。

__init__(self, name, doc, default=None, cmdline=DEFAULT)

配置对象

Config 对象保存选项的选定值(如果未进行选择,则为默认值)。Config 对象由 OptionDescription 实例描述。 Config 对象的属性是 OptionDescription 子项的名称。示例

>>> from rpython.config.config import OptionDescription, Config, BoolOption
>>> descr = OptionDescription("options", "", [
...     BoolOption("bool", "", default=False)])
>>>
>>> config = Config(descr)
>>> config.bool
False
>>> config.bool = True
>>> config.bool
True

Config 上的(有用)方法的描述

__init__(self, descr, **overrides):
descrOptionDescription 的一个实例,它描述了配置对象。 overrides 可用于设置不同的默认值(请参阅方法 override)。
override(self, overrides):
覆盖默认值。这将覆盖的值标记为默认值,这使得可以更改它们(通常只能更改一次值)。 overrides 是一个字典,其中包含从路径字符串到值的映射。
set(self, **kwargs):
“do what I mean”-界面用于选项设置。从该配置开始搜索所有路径,以匹配可选参数,如果匹配不模糊,则设置找到的选项。

Optparse 解析器的生成

要生成 optparse 解析器,请使用函数 to_optparse。它将使用回调创建选项解析器,以便用于创建解析器的配置对象会自动更新。

to_optparse(config, useoptions=None, parser=None):
返回一个 optparse 解析器。 config 是要为其创建解析器的配置对象。 useoptions 是要为其创建命令行选项的选项列表。它可以包含指向选项的完整路径,也可以包含指向选项描述的路径,以及额外的“.*”,以生成该描述的所有子选项的命令行选项。如果 useoptionsNone,则所有子选项都将转换为命令行选项。 parser 可以是现有的解析器对象,如果传入 None,则会创建一个新的解析器对象。

PyPy 中配置对象的使用

PyPy 的两个主要部分,Python 解释器和 RPython 工具链,具有两组独立的选项。翻译工具链选项可以在所有 TranslationContext 实例的 config 属性中找到,并在 rpython/config/translationoption.py 中描述。解释器选项附加到对象空间,也在 config 名称下,并在 pypy/config/pypyoption.py 中描述。这两组选项都在 PyPy 的配置选项 部分中进行了说明。