import yaml class MyLoader(yaml.SafeLoader): # returns def construct_mapping(self, *args, **kwargs): super().add_constructor(None, construct_undefined) # when loading we want to skip keys that require construction, mapping = super().construct_mapping(*args, **kwargs) return mapping import typing class Tagged(typing.NamedTuple): tag: str value: object def construct_undefined(self, node): if isinstance(node, yaml.nodes.ScalarNode): value = self.construct_scalar(node) elif isinstance(node, yaml.nodes.SequenceNode): value = self.construct_sequence(node) elif isinstance(node, yaml.nodes.MappingNode): value = self.construct_mapping(node) else: assert False, f"unexpected node: {node!r}" return Tagged(node.tag, value)