Я понимаю, что YAML позволяет представлять произвольные данные с помощью тегов. Я хотел бы преобразовать PosixPath в str вместо того, чтобы представлять его как !!pathlib.PosixPath. Как я могу указать pyyaml преобразовывать PosixPath в str каждый раз, когда он встречает этот тип?






Чтобы представить экземпляры pathlib в виде общих строк, используйте скалярный тег tag:yaml.org,2002:str (см. раздел 10.1.1.3 спецификации ).
Чтобы добавить этот представитель для дамперов по умолчанию:
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))
Это отлично работает, спасибо! Вместо path_representer отдельной функции я просто добавил lambda в вызов add_representer, и это тоже сработало.
Даже в приложении могут быть другие части этого приложения, о которых вы не знаете, которые используют PyYAML. Я всегда рекомендовал бы использовать подкласс.