如何在TOML/INI等配置文件中存储复数与复数组?
如何在人类可读配置文件中存储复数
方案1:继续使用TOML,字符串存储+安全解析
你提到的用ast.literal_eval解析字符串格式复数的做法完全合规,没有任何不规范的问题。ast.literal_eval是Python标准库提供的安全字面量解析工具,只会解析Python原生的基础类型字面量(数字、字符串、列表、字典、元组等),不会执行任意代码,安全性和标准TOML/JSON解析器处于同一级别,比自己写正则解析复数格式靠谱得多。注意绝对不要直接用内置eval做解析,会存在任意代码执行的安全风险,ast.literal_eval不存在这个问题。
配置文件中可以直接按日常书写复数的习惯写,只需要加引号标记为字符串即可,可读性几乎不受影响:
# config.toml 配置示例 # 单个复数 my_complex_number = "3+3j" # 复数数组 my_complex_array = "[2+2j, 3+3j, 1-4j]"
解析代码也非常简洁:
import toml from ast import literal_eval import numpy as np config = toml.load("config.toml") # 解析单个复数 c_val = literal_eval(config["my_complex_number"]) # 解析为numpy复数数组 c_arr = np.array(literal_eval(config["my_complex_array"]), dtype=complex)
这个方案的优势是完全兼容你已经熟悉的TOML生态,不需要切换工具链,学习成本为0;唯一的小缺点是解析后需要多一步转换,不能直接从TOML解析结果中拿到复数类型值。
方案2:切换到更灵活的配置格式
如果你希望配置解析后直接拿到复数类型,不需要额外转换,可以考虑切换到支持自定义类型解析的配置格式:
- YAML:生态成熟度和TOML相当,人类可读性好。只需要给YAML的安全解析器加几行复数类型的构造逻辑,就可以直接在配置中写不带引号的复数字面量,比如
my_complex: 3+3j,解析后直接得到Python复数类型。注意不要使用不安全的默认yaml.load,一定要基于yaml.safe_load扩展类型支持。 - HJSON/JSON5:作为JSON的人类友好扩展,支持注释、尾逗号、无引号键名等特性,同样可以通过自定义反序列化逻辑实现复数原生支持,不过生态普及度比TOML、YAML稍低。
不推荐的方案
不要把复数拆成实部、虚部分开存储,比如单独存my_complex_real = 3、my_complex_imag = 3,存储复数数组时需要分别存实部数组和虚部数组,可读性极差,后续修改配置时很容易出现实部虚部位置对应错误的问题。
内容的提问来源于stack exchange,提问作者Drphoton
相关产品推荐
相关产品推荐

