如何告诉 Pyyaml 将 yaml.dump 中的 PosixPath 转换为 str?

问题描述 投票:0回答:1

我了解 YAML 允许您使用标签表示任意数据。我想将 PosixPath 转换为 str,而不是将其表示为

!!pathlib.PosixPath
。如何告诉 pyyaml 在每次遇到该类型时将 PosixPath 转换为 str?

python yaml pyyaml
1个回答
0
投票

为默认转储器添加它:

import pathlib
import yaml.dumper

data = {"me": pathlib.Path("/home/xaviersjs")}

def path_representer(dumper, obj):
    return dumper.represent_scalar("tag:yaml.org,2002:str", str(obj))

for dumper_name in yaml.dumper.__all__:
    Dumper = getattr(yaml.dumper, dumper_name)
    yaml.add_representer(
        type(pathlib.Path()),
        path_representer,
        Dumper,
    )

print(yaml.dump(data))
print(yaml.safe_dump(data))

请注意,这会全局修改 PyYAML 的默认行为。如果您在应用程序中执行此操作,这可能是可以接受的,但库修改全局可变状态是不可接受的。

如果您是一个库,请创建自己的修补转储器类型并显式使用它,不要修改 PyYAML 本身的全局可变状态:

import pathlib
import yaml.dumper

data = {"me": pathlib.Path("/home/xaviersjs")}

def path_representer(dumper, obj):
    return dumper.represent_scalar("tag:yaml.org,2002:str", str(obj))

class MyDumper(yaml.dumper.SafeDumper):
    pass

yaml.add_representer(
    type(pathlib.Path()),
    path_representer,
    MyDumper,
)

print("patched:", yaml.dump(data, Dumper=MyDumper))
print("default:", yaml.dump(data))
© www.soinside.com 2019 - 2024. All rights reserved.