跳到正文
效率工具实用笔记关于本站
表格与数据

INI配置里的%(name)s是什么:BasicInterpolation插值取值顺序

约 7 分钟阅读AI 辅助整理

%(name)s 是 ConfigParser 默认插值语法,用来引用同一节或 DEFAULT 节里的值。本文用自建 INI 样例说明引用顺序、%% 转义百分号的写法,以及插值按需解析意味着什么。

本文要点

  1. %(name)s 里的 name 是键名,不是节名

  2. DEFAULT 节是 BasicInterpolation 的第二个取值来源

  3. BasicInterpolation 把 % 当作特殊字符,所以值里想出现一个普通的百分号,要写成 %%

INI配置里的%(name)s是什么:BasicInterpolation插值取值顺序的知识要点示意图
依据已审核正文摘取要点制作的示意图,非实物照片;请结合正文中的条件与范围阅读。要点摘自已审核正文;完整条件与说明见正文。查看高清图解 ↗
本文目录

先看一个自建样例:%(name)s 在值里长什么样

如果你在自己写的 INI 文件里看到某个值写成 %(home_dir)s/lumberjack,这里的 %(home_dir)s 不是普通文字,而是 BasicInterpolation 的引用写法。

按 configparser 文档的说明,ConfigParser 默认使用 BasicInterpolation,它允许值里包含格式字符串,去引用同一节里的其他值,或者引用特殊 DEFAULT 节里的值。

一个自建样例(练习数据,不是真实配置):在练习目录里新建 exercise/demo.ini,内容如下:

[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures

读 my_dir 时,%(home_dir)s 会被替换成 home_dir 的值 /Users,结果是 /Users/lumberjack。读 my_pictures 时,%(my_dir)s 先解析成 /Users/lumberjack,再拼上 /Pictures。

本文只讲 BasicInterpolation 如何用 %(键名)s 引用同节或 DEFAULT 节的值、%% 怎么转义百分号,以及“按需解析”是什么意思。不讲 ExtendedInterpolation 的跨节语法,也不涉及其他模板机制。

动手前建议先复制一份练习文件,不要拿正在用的配置直接试。

引用同节的值:键名写在括号里,解析结果取决于那一项

%(name)s 里的 name 是键名,不是节名。BasicInterpolation 默认只在当前节和 DEFAULT 节里找这个键。

用上面的自建样例继续看。my_dir 这一项写在 [Paths] 节里,它引用的是 home_dir。home_dir 也写在 [Paths] 节里,所以能找到,解析成功。

如果引用的键名在当前节里不存在,BasicInterpolation 会去 DEFAULT 节找。这就是文档说的“引用同一节里的其他值,或者引用特殊 DEFAULT 节里的值”。

一个容易忽略的点:文档说明所有用于插值的选项名都会经过 optionxform() 方法处理,默认实现是把选项名转成小写。所以 foo %(bar)s 和 foo %(BAR)s 在默认设置下是等价的。写引用时不必纠结大小写,但要知道它会被统一处理。

检查方法(编辑整理的核对方向,不是对某款配置的实测):把被引用的键先单独读出来,确认它存在且值符合预期,再看引用它的那一项解析结果对不对。

引用 DEFAULT 节的值:同节没有就去默认节找

DEFAULT 节是 BasicInterpolation 的第二个取值来源。当当前节里没有同名键时,插值会去 DEFAULT 节取。

一个自建样例(练习数据):在 exercise/demo.ini 里加一个 DEFAULT 节:

[DEFAULT]
base_dir: /srv

[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures

这时如果在 [Paths] 里写一个引用 %(base_dir)s 的值,当前节没有 base_dir,就会去 DEFAULT 节取到 /srv。

顺序可以这样记:先看当前节有没有这个键,有就用当前节的值;当前节没有,再看 DEFAULT 节。文档还说明,DEFAULT 节的值会出现在所有其他节里,所以从某个节读一个只在 DEFAULT 里定义的键,也能读到。

需要划清的边界:本文只讲 BasicInterpolation 在当前节和 DEFAULT 节之间的取值顺序。跨节引用其他普通节的值,属于 ExtendedInterpolation 的语法范围,本文不展开。

%% 转义百分号:值里要写一个真正的 % 时怎么办

BasicInterpolation 把 % 当作特殊字符,所以值里想出现一个普通的百分号,要写成 %%。

文档给出的自建示例是:

[Escape]
gain: 80%%

读 gain 时,%% 会被解析成一个 %,结果是 80%。文档同时说明,% 是唯一需要转义的字符。

为什么需要这一步:如果直接写 80%,解析器会把它当成插值语法的开头,去找后面的括号和键名。写成 80%% 才是明确的“这里就是一个百分号”。

检查方法(编辑整理的核对方向):读出来之后看结果里是一个 % 还是两个 %%。如果看到两个 %%,说明转义没生效或写错了位置。

本节只讲 %% 的写法。其他转义字符不在 BasicInterpolation 的范围内,本文不涉及。

按需解析:引用链的顺序不必和文件里的书写顺序一致

“按需解析”是 BasicInterpolation 的一个关键特性。文档的原话是:所有插值都是按需完成的,所以引用链里用到的键不必按特定顺序写在配置文件里。

这句话的意思是:解析发生在你读取某个值的时候,而不是在文件被读入的那一刻。所以 my_pictures 引用 my_dir、my_dir 引用 home_dir,这三项在文件里谁先谁后都不影响结果。

一个自建样例(练习数据):把 [Paths] 节里的顺序倒过来写:

[Paths]
my_pictures: %(my_dir)s/Pictures
my_dir: %(home_dir)s/lumberjack
home_dir: /Users

读 my_pictures 时,解析器会顺着 my_dir 找到 home_dir,再逐层替换回来。结果和正序写法一致。

对比一下:文档说明,如果把插值设为 None,解析器就会原样返回 %(my_dir)s/Pictures,不做任何替换。这说明替换动作是由插值处理器在读取时完成的,不是文件解析阶段就固定下来的。

一个操作上的提醒:按需解析意味着每次读取都可能重新走一遍引用链。写引用时保持链条单向,是避免这类问题的基本做法。

自己核对结果:先读被引用项,再读引用项

想确认插值结果对不对,可以按下面的顺序做(编辑整理的核对方向,不是对某款配置的实测):

1. 先单独读被引用的键,确认它存在、值符合预期。

2. 再读引用它的键,看替换后的完整结果。

3. 如果结果和预期不符,先确认这次读取用的是哪种方式。

文档还提到一个相关点:get() 方法可以传 raw=True 来在单次读取时关闭插值。所以同一个键,用默认方式读和用 raw=True 读,结果可能不同。核对时先确认自己用的是哪种方式,再判断结果。

一个边界:本文所有样例都是自建的练习数据,放在练习目录里,不涉及真实配置。动手前先复制一份文件,不要直接改正在使用的配置。

观看知识要点视频 18 秒

18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。

参考资料

以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。

请结合原始资料的适用条件阅读。

返回表格与数据 →