用非标准类型构造节点

2024-09-28 19:02:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试解决是否可以导入yaml文件并使用自己的对象类型进行映射和序列

在标准构造函数中,它使用内置类型: http://pyyaml.org/browser/pyyaml/tags/3.10/lib/yaml/constructor.py#L112http://pyyaml.org/browser/pyyaml/tags/3.10/lib/yaml/constructor.py#L120

我想知道是否有一种方法可以用我自己的数据类型来构建这些映射和序列,而不用我的猴子补丁yaml.constructor.BaseConstructor.构造

我尝试了以下方法:

from __future__ import absolute_import, unicode_literals
from noconflict import classmaker
from yaml import YAMLObject
import yaml

try:
    # Try for python 3 first
    from collections.abc import Sequence
    from collections.abc import Mapping
except ImportError:
    from collections import Sequence
    from collections import Mapping


class SettingsMapping(Mapping, YAMLObject):
    __metaclass__ = classmaker()
    yaml_tag = '!!map'

    def __init__(self, *args, **kwargs):
        self.__dict__.update(*args, **kwargs)

    def __getitem__(self, item, default=None):
        return self.__dict__.get(item, default=default)

    def __iter__(self):
        return self.__dict__.iterkeys()

    def __len__(self):
        return len(self.__dict__)


class SettingsSequence(Sequence, YAMLObject):
    __metaclass__ = classmaker()
    yaml_tag = '!!seq'

    def __init__(self, *args):
        self.list = args

    def __getitem__(self, item):
        return self.list[item]

    def __len__(self):
        return len(self.list)

for cls in [SettingsMapping, SettingsSequence]:
    yaml.add_constructor(cls.yaml_tag, cls)

y = yaml.load(open('input.yaml')

在哪里noconflict.classmaker来自: http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/

但是:

>>> type(y)
dict

Tags: fromimportselfhttpyamllenreturndef