我了解 YAML 允许您使用标签表示任意数据。我想将 PosixPath 转换为 str,而不是将其表示为
!!pathlib.PosixPath
。如何告诉 pyyaml 在每次遇到该类型时将 PosixPath 转换为 str?
为默认转储器添加它:
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))