如何让TOML Kit支持自定义对象(如pathlib.Path)的序列化?
解决TOML Kit序列化pathlib.Path对象的问题
TOML Kit本身确实没有内置pathlib.Path类型的序列化支持,不过它提供了自定义类型转换器的机制,完全可以实现通用的类型扩展,针对Path对象的处理非常简单:
1. 注册自定义转换器
使用tomlkit.register_converter方法,给Path类型绑定一个转换函数,把Path对象转为TOML支持的字符串类型即可:
import pathlib import tomlkit # 注册Path类型转换器 tomlkit.register_converter(pathlib.Path, lambda path: str(path))
2. 测试序列化
注册之后,直接序列化Path对象就不会报错了:
# 创建包含Path对象的数据 data = { "project": { "root": pathlib.Path("src"), "config": pathlib.Path("config/settings.toml") } } # 生成TOML字符串 toml_str = tomlkit.dumps(data) print(toml_str)
输出的TOML内容会是:
[project] root = "src" config = "config/settings.toml"
3. 通用扩展思路
如果要支持其他自定义对象,只需要给对应的类型注册转换函数,返回TOML规范允许的基础类型(字符串、整数、浮点数、布尔值、数组、嵌套表等)就行。比如自定义一个User类,转成包含必要字段的字典:
class User: def __init__(self, name, age): self.name = name self.age = age # 注册User类型转换器 tomlkit.register_converter(User, lambda user: {"name": user.name, "age": user.age}) # 使用示例 data = {"author": User("toto", 30)} print(tomlkit.dumps(data))
这样序列化出来的TOML会是:
[author] name = "toto" age = 30
这种方式比每次手动转类型要更通用,一劳永逸解决同类型对象的序列化问题。
内容的提问来源于stack exchange,提问作者toto
相关产品推荐
相关产品推荐

