一种简单的配置文件格式

一种简单的配置文件格式

核心原则

  1. 只做数据交换,不负责任何其他职责。
  2. 一切作为字符串处理。
  3. 采用 key=value 格式。悬垂 key 时,等号可以省略。
  4. 字符串可以按特定格式解释为 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  '         

引号规则

  1. 单引号 ' 和双引号 " 完全等效。
  2. 引号可选,仅在以下情况必须使用:
    • 值需要保留首尾空格
    • 值以空格开头或结尾
    • 键包含等号或首尾空格
  3. 引号包裹的字符串内,相同类型的引号需要转义(见转义规则)。
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
多行 """ 包裹,保留换行和缩进
注释 行首 #,无行内注释
类型 纯字符串,无类型系统
结构 逗号/冒号在值内,由程序层解析
复制代码
相关推荐
xuhaoyu_cpp_java3 小时前
MySql学习(四)
数据库·经验分享·笔记·sql·学习·mysql
鸿儒5173 小时前
中医学习首篇笔记
笔记·学习·中医
三品吉他手会点灯4 小时前
STM32F103 学习笔记-21-串口通信(第4节)—串口发送和接收代码讲解(上)
笔记·stm32·单片机·嵌入式硬件·学习
qingwufeiyang_5304 小时前
Mybatis-plus学习笔记1
笔记·学习·mybatis
Sophie_U5 小时前
【Agent开发速成笔记】一、从0到1基础Python学习
笔记·python·学习·agent·智能体
半壶清水5 小时前
[软考网规考点笔记]-局域网之VLAN
网络·笔记·网络协议·tcp/ip
数据皮皮侠AI5 小时前
顶刊同款!中国地级市风灾风险与损失数据集(2000-2022)|灾害 / 环境 / 经济研究必备
大数据·人工智能·笔记·能源·1024程序员节
墨^O^5 小时前
C++ Memory Order 完全指南:从 relaxed 到 seq_cst,深入理解无锁编程与 happens-before
linux·开发语言·c++·笔记·学习·算法·缓存
玄米乌龙茶1235 小时前
Web Search API 实操:构建智能搜索 Agent
人工智能·笔记·学习