Problem:
You are trying to yaml.safe_dump()
an object which is (or contains) a namedtuple
instance such as:
import yaml import collections MyTuple = collections.namedtuple("MyTuple", ["a", "b", "c"]) mytuple = MyTuple(1,2,3) yaml.safe_dump(mytuple)
which results in the following exception:
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', MyTuple(a=1, b=2, c=3))
Solution:
You need to add a custom representer to implicitly convert your namedtuple
to a dict.
Before running yaml.safe_dump()
, add the following lines:
import collections def represent_namedtuple(dumper, data): return dumper.represent_dict(data._asdict()) yaml.SafeDumper.add_representer(MyTuple, represent_namedtuple)
You need to add_representer()
for every namedtuple you use!
Now, the yaml.safe_dump()
call should work perfectly:
yaml.safe_dump(mytuple) # Returns 'a: 1\nb: 2\nc: 3\n'