From ed57b2478fa73523293f21e1fe962da8906bdbd3 Mon Sep 17 00:00:00 2001 From: Eric Engestrom Date: Sat, 1 Nov 2025 13:34:56 +0100 Subject: [PATCH 1/2] Accept `str` subclasses in SafeRepresenter For instance, Python 3.11 introduced `enum.StrEnum`, which subclasses `str`, and should be used as such. --- lib/yaml/representer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/yaml/representer.py b/lib/yaml/representer.py index 808ca06df..9dd4e8f70 100644 --- a/lib/yaml/representer.py +++ b/lib/yaml/representer.py @@ -233,7 +233,7 @@ def represent_undefined(self, data): SafeRepresenter.add_representer(type(None), SafeRepresenter.represent_none) -SafeRepresenter.add_representer(str, +SafeRepresenter.add_multi_representer(str, SafeRepresenter.represent_str) SafeRepresenter.add_representer(bytes, From 144279c2a3da0df4d14703ce9867cd9e151d7e14 Mon Sep 17 00:00:00 2001 From: Eric Engestrom Date: Sat, 1 Nov 2025 13:27:39 +0100 Subject: [PATCH 2/2] Enforce support for Python 3.11's StrEnum --- tests/test_dump_load.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/test_dump_load.py b/tests/test_dump_load.py index 8c4352bd1..caa24dd89 100644 --- a/tests/test_dump_load.py +++ b/tests/test_dump_load.py @@ -1,3 +1,6 @@ +import enum +import sys + import pytest import yaml @@ -13,3 +16,11 @@ def test_load_no_loader(): def test_load_safeloader(): assert yaml.load("- foo\n", Loader=yaml.SafeLoader) + + +@pytest.mark.skipif(sys.version_info < (3, 11), reason="StrEnum was added in Python 3.11") +def test_StrEnum(): + class TestEnum(enum.StrEnum): + TEST_VALUE = "test value" + + assert yaml.load(yaml.dump(TestEnum.TEST_VALUE), Loader=yaml.SafeLoader) == TestEnum.TEST_VALUE