一种简单的配置文件格式
核心原则
- 只做数据交换,不负责任何其他职责。
- 一切作为字符串处理。
- 采用
key=value格式。悬垂key时,等号可以省略。 - 字符串可以按特定格式解释为
List[str]或Dict[String,String],具体解析行为由应用层决定。
基本结构
example
# 省略形式,同 key = ""
key
# 标准形式,同 key = ""
key =
# 标准形式
key = value
# 标准形式
"key with =" = value
# 格式支持,由程序决定是否允许 "" 作为键。
"" =
值的类型与形式
| 形式 | 示例 | 结果 |
|--------------±------------------------------±------------------------|
| 裸字符串 | key = foo | "foo" |
| 含空格 | key = foo bar | "foo bar" |
| 双引号包裹 | key = "foo bar" | "foo bar" |
| 单引号包裹 | key = 'foo bar' | "foo bar" |
| 多行字符串 | key = """...""" | 保留换行和缩进 |
键的规则
- 键可以包含任何字符(包括空格、等号、引号等)。
- 如果键包含 =(等号),必须用双引号或单引号包裹。
- 如果键包含首尾空格,也必须用引号包裹。
- 引号包裹的键,内部引号需转义(见转义规则)。
- 键两侧的空格会被自动
trim。 - 键可以重复,具体合法性与有效值由程序决定。
example
# 普通键
key = value
# 含空格的键
"key with spaces" = value
# 含等号的键
"key=with=equals" = value
# 含引号的键
'key with "quotes"' = value
值的规则
- 值可以是任意字符串。
- 无引号包裹时,值会
trim首尾空格。 - 有引号包裹时,值保留首尾空格。
- 值中的转义序列会被处理(见转义规则)。
- 相同类型引号在字符串内禁止出现,需用另一种引号包裹。
example
# 同 "simple"
key1 = simple
# 同 "leading spaces"(trim后)
key2 = leading spaces
# 同 " kept spaces "
key3 = " kept spaces "
# 同 " kept spaces "
key4 = ' kept spaces '
引号规则
- 单引号
'和双引号"完全等效。 - 引号可选,仅在以下情况必须使用:
- 值需要保留首尾空格
- 值以空格开头或结尾
- 键包含等号或首尾空格
- 引号包裹的字符串内,相同类型的引号需要转义(见转义规则)。
example
# 保留首尾空格
key1 = " spaces "
# 同上
key2 = ' spaces '
# 键含等号
"key with =" = value
# 键含双引号
'key "quoted"' = value
转义规则
只有一种转义序列:\uXXXX(4位十六进制 Unicode)。
\uXXXX→ 对应的 Unicode 字符\\u→ 字面量\u(两个字符:反斜杠 + u)- 其他
\c组合 →\作为普通字符保留,c原样保留 - 转义仅在字符串解析时处理,不影响文件存储
example
# 世界
unicode = \u4e16\u754c
# "\u4e16"
literal = \\u4e16
# "C:\\Users\\name"(反斜杠保留)
raw = C:\Users\name
# 同 'he said "hello"'
quote = "he said 'hello'"
多行字符串
使用 """ 包裹,支持换行和缩进原样保留,不进行 trim 。
语法规则
"""可以独占一行,也可以紧跟内容开始- 结束的
"""必须独占一行 - 内容中的所有字符(包括换行、缩进、空格)都原样保留
- 多行字符串内的引号无需转义,除非是
"""序列。此时需要以 \u0022 或 \u0027 转义。
示例
example
query = """
SELECT id, name
FROM users
WHERE active = 1
"""
template = """Hello
World"""
sql = "SELECT * FROM users" # 单行时不使用多行语法
注释
- 以
#开头的行是注释,完全忽略。 - 不支持行内注释(
#出现在值中时作为普通字符)。 - 空行被忽略。
example
# 这是注释
enabled # 这不是注释,# 是值的一部分
host = localhost
# 空行上方会被忽略
port = 8080
数组与字典(程序层解析)
配置层只传递字符串,结构化解析由应用层负责。
数组约定
应用层可将逗号分隔的值解析为数组:
example
cors = http://a.com,https://b.com,http://c.com
# 应用层可以解析为 ["http://a.com", "https://b.com", "http://c.com"]
字典约定
应用层可将冒号分隔的键值对解析为字典:
example
levels = debug:1,info:2,error:3
# 应用层可以解析为 {"debug": "1", "info": "2", "error": "3"}
注意事项
- 这些格式约定不是语法规则,而是应用层的常见实践。
- 应用可以自由选择其他解析方式(如 JSON 嵌套)。
完整示例
example
# 悬垂键(空值)
enabled
debug
# 简单值
host = localhost
port = 8080
# 含空格的值(等效写法)
path = /var/log/app
path = "/var/log/app"
# 含特殊字符的键
"server.host" = localhost
"key with spaces" = value
"key=with=equals" = value
# 多行
query = """
SELECT id, name
FROM users
WHERE active = 1
"""
# 程序层可以解析为数组
cors = http://a.com,https://b.com
# 程序层可以解析为字典
levels = debug:1,info:2,error:3
# 保留首尾空格
spaced = " hello world "
# Unicode 转义
greeting = \u4f60\u597d
# 字面量反斜杠
path = C:\Users\name
规范要点
| 项目 | 规则 |
|---|---|
| 键 | 任意字符,含等号时必须引号包裹 |
| 值分隔 | 等号(=) |
| 值内容 | 保留内部空格,无引号时 trim 首尾空格 |
| 引号 | 可选,单双等效 |
| 转义 | 仅 \uXXXX |
| 多行 | """ 包裹,保留换行和缩进 |
| 注释 | 行首 #,无行内注释 |
| 类型 | 纯字符串,无类型系统 |
| 结构 | 逗号/冒号在值内,由程序层解析 |