自定义解析器行为 Python 模块 'configparser'。

2024年8月29日 | 阅读 7 分钟

利用 ConfigParser 模块来管理任何应用程序的用户文档和文件。文档格式被组织成段;每个段都可以包含用于组织数据的键值对。还支持使用 Python 格式化字符串技术进行键值插值,以构建相互依赖的值(这对于 URL 和消息字符串特别有用)。

ConfigParser 使用的文档格式类似于 Microsoft Windows 旧版本的格式。它由一个或多个命名段组成,每个段都可以包含具有名称和值的单独选项。

Config 文档段是通过查找以 [ 开头的行来识别的。方括号之间的值是段名,可以包含除方括号以外的任何字符。

自定义解析器行为

使用它的应用程序几乎和 INI 格式的变体一样多。Python 模块 configparser 在很大程度上支持最广泛的 INI 样式。历史背景主要决定了默认功能,几乎可以肯定,您需要自定义其中一些功能。

影响特定配置解析器工作方式的最常见方法是使用 __init__() 函数选项。

1. Defaults, 默认值:None

此选项接受一个键值对字典,该字典将首先放入 DEFAULT 段。这是一种有效的支持紧凑型配置文件的方法,这些配置文件不指定与文档默认值相等的值。

一个技巧:如果您想为特定段指定默认值,请在读取实际文件之前使用 read_dict() 函数。

2. dict_type, 默认值:dict

这一系列选项会影响映射协议未来的工作方式以及配置文件将如何显示。使用标准字典,每个段都按照添加到解析器的顺序存储。选项在段内的顺序也是如此。

可以使用替代类型而不是字典,例如,在写回时对段和选项进行排序。

请注意:有方法可以在一次操作中添加一组键值对。当您在这些操作中使用标准字典时,键的顺序将是已排序的。例如

Python 控制台屏幕

3. allow_no_value, 默认值:False

一些配置文件已知包含没有值的设置;但是,它们仍然符合 configparser 支持的语法。构造函数中的 allow_no_value 参数可用于指示应接受此类值:例如

Python 控制台屏幕

4. delimiters, 默认值:(':', '=')

分隔符是分隔段内键和值的子字符串。一行中第一次出现分隔子字符串被视为分隔符。这意味着值(但不是键)可以包含分隔符。

另请参阅 ConfigParser.write() 的 space_around_delimiters 参数。还有另一种配置是 Comment prefixes,其默认值为 (' ; ', ' # ')

5. inline_comment_prefixes, 默认值:None

注释前缀是表示配置文件中有效注释开始的字符串。comment_prefixes 仅用于空行(可选缩进),而 inline_comment_prefixes 可用于每个有效值之后(例如,段名、选项和空行)。默认情况下,内联注释是禁用的,并且 '#' 和 ';' 用作整行注释的前缀。

版本 3.2 中已更改:在 configparser 的早期版本中,行为匹配 comment_prefixes=(';', '#') 和 inline_comment_prefixes=(';',)。

请注意,配置解析器不支持使用注释前缀进行转义。使用 inline_comment_prefixes 可能会阻止用户指定用作注释前缀的字符的值。如果可能,请勿设置 inline_comment_prefixes。在任何情况下,在多行值中将注释前缀字符存储在行首的唯一方法是添加前缀,例如

Python 控制台屏幕

6. strict, 默认值:True

当设置为 True 时,解析器在从单个源(使用 read_file() 函数、read_string() 函数或 read_dict() 函数)读取时,不允许任何段或选项重复。建议在新应用程序中使用严格解析器。

版本 3.2 中已更改:在 configparser 的早期版本中,行为匹配 strict=False。

7. empty_lines_in_values, 默认值:True

在配置解析器中,值可以跨越多行,只要它们的缩进比保存它们的键更多即可。默认情况下,解析器也允许空行作为值的一部分。同时,键可以任意缩进以进一步提高可读性。结果是,当配置文件变得庞大而复杂时,用户很容易混淆文件结构。例如

Python 控制台屏幕

这可能尤其错误,因此用户可能会检查他们是否使用了相对字体来编辑文件。这就是为什么您的应用程序不需要包含空行的值,并且您应该考虑拒绝它们。每次这都会导致空行分成多个键。在上面的示例中,它将创建两个键,key_s 和 can。

8. default_section, 默认值:configparser.DEFAULTSECT (即:"DEFAULT")

允许为其他段或插值目的保留一个默认值段是此库的一个强大概念,它允许用户创建复杂的描述性配置。此段通常称为“DEFAULT”,但可以修改为指向另一个有效的段名。一些常见的值包括“general”或“common”。给定名称用于在从任何源读取时识别默认段,并在将配置写回文件时使用。它的当前值可以通过 parser_instance.default_section 属性检索,并且可以在运行时进行修改(例如,将文件从一种配置转换为另一种配置)。

9. interpolation, 默认值:configparser.BasicInterpolation

可以通过 interpolation 参数自定义插值行为。None 可用于关闭插值;ExtendedInterpolation() 函数提供了受 zc.buildout 启发的更高级的变体。更多内容将在专用文档段中介绍。RawConfigParser 的默认值为 None。

10. converters, 默认值:未设置

配置解析器提供执行类型转换的选项值获取器。默认情况下,实现了 getint()、getfloat() 和 getboolean() 函数。如果需要其他获取器,用户可以在子类中定义它们,或者传递一个字典,其中每个键是获取器的名称,每个值是一个执行所述转换的可调用对象。例如,传递 {'decimal': decimal.Decimal} 将在解析器对象和所有段代理上添加 getdecimal() 函数。换句话说,可以编写 parser_instance.getdecimal('section', 'key', fallback=0) 和 parser_instance['section'].getdecimal('key', 0)。

如果转换器需要访问解析器的状态,它可以在配置解析器子类上实现为方法。如果此方法的名称以 get 开头,则它将在所有段代理上以类似字典的结构可用(参见上面的 getdecimal() 函数示例)。