| 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) |