使用复杂键加载映射



pyyaml无法加载具有如下复杂键的映射,因为dict不可哈希。

foo:
- {bar: test}: 123

是否可以强制pyyaml加载具有复杂键的映射?

在Python中,字典键必须是唯一的并且可以散列。默认字典是不可哈希的。

您需要创建一个自定义的可散列字典类。你可以从这里的答案中获得灵感。Python可散列dicts

之后,您需要告诉pyyaml使用自定义词典。也许这个问题会引导你走向正确的方向。如何在加载yaml时使用自定义字典类?

我已经"已解决";这与以下polyfill:

from collections.abc import Hashable
from yaml import MappingNode
from yaml.constructor import BaseConstructor

def construct_mapping(self: BaseConstructor, node: MappingNode, deep=True):
mapping = {}
for key_node, value_node in node.value:
key = self.construct_object(key_node, True)
if not isinstance(key, Hashable):
key = type('hashable', (key.__class__,), {'__hash__': lambda _: 1})(key)
value = self.construct_object(value_node, True)
mapping[key] = value
return mapping

BaseConstructor.construct_mapping = construct_mapping

最新更新