Wie man Python yaml.representer.RepresenterError behebt: ('cannot represent an object', defaultdict(<class 'list'>, ....

Problem:

Sie versuchen, ein Objekt, das (oder das) ein defaultdict ist, mit yaml.safe_dump() zu serialisieren, z.B.:

yaml_fix.py
import yaml
import collections

yaml.safe_dump(collections.defaultdict(list))

was zur folgenden Ausnahme führt:

yaml_repr_error.py
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/uli/.local/lib/python3.10/site-packages/yaml/__init__.py", line 269, in safe_dump
    return dump_all([data], stream, Dumper=SafeDumper, **kwds)
  File "/home/uli/.local/lib/python3.10/site-packages/yaml/__init__.py", line 241, in dump_all
    dumper.represent(data)
  File "/home/uli/.local/lib/python3.10/site-packages/yaml/representer.py", line 27, in represent
    node = self.represent_data(data)
  File "/home/uli/.local/lib/python3.10/site-packages/yaml/representer.py", line 58, in represent_data
    node = self.yaml_representers[None](self, data)
  File "/home/uli/.local/lib/python3.10/site-packages/yaml/representer.py", line 231, in represent_undefined
    raise RepresenterError("cannot represent an object", data)
yaml.representer.RepresenterError: ('cannot represent an object', defaultdict(<class 'list'>, {}))

Lösung

Sie müssen einen benutzerdefinierten Representer hinzufügen, um das defaultdict implizit in ein dict zu konvertieren.

Fügen Sie vor der Ausführung von yaml.safe_dump() die folgenden Zeilen hinzu:

represent_defaultdict_fix.py
import collections
from yaml.representer import Representer

yaml.SafeDumper.add_representer(collections.defaultdict, Representer.represent_dict)

Nun sollte der yaml.safe_dump()-Aufruf einwandfrei funktionieren:

yaml_safe_dump_defaultdict_fixed.py
yaml.safe_dump(collections.defaultdict(list)) # Returns'{}\n'

Check out similar posts by category: Python