当前位置: 首页 > 面试题库 >

在Python中,如何将YAML映射加载为OrderedDicts?

喻子航
2023-03-14
问题内容

我想让PyYAML的加载程序将映射(和有序映射)加载到Python 2.7+
OrderedDict类型中,而不是dict它当前使用的普通和​​对列表。

最好的方法是什么?


问题答案:

注意 :有一个基于以下答案的库,该库还实现了CLoader和CDumpers:Phynix /
yamlloader

我非常怀疑这是最好的方法,但这是我想出的方法,并且确实有效。也可作为要点。

import yaml
import yaml.constructor

try:
    # included in standard lib from Python 2.7
    from collections import OrderedDict
except ImportError:
    # try importing the backported drop-in replacement
    # it's available on PyPI
    from ordereddict import OrderedDict

class OrderedDictYAMLLoader(yaml.Loader):
    """
    A YAML loader that loads mappings into ordered dictionaries.
    """

    def __init__(self, *args, **kwargs):
        yaml.Loader.__init__(self, *args, **kwargs)

        self.add_constructor(u'tag:yaml.org,2002:map', type(self).construct_yaml_map)
        self.add_constructor(u'tag:yaml.org,2002:omap', type(self).construct_yaml_map)

    def construct_yaml_map(self, node):
        data = OrderedDict()
        yield data
        value = self.construct_mapping(node)
        data.update(value)

    def construct_mapping(self, node, deep=False):
        if isinstance(node, yaml.MappingNode):
            self.flatten_mapping(node)
        else:
            raise yaml.constructor.ConstructorError(None, None,
                'expected a mapping node, but found %s' % node.id, node.start_mark)

        mapping = OrderedDict()
        for key_node, value_node in node.value:
            key = self.construct_object(key_node, deep=deep)
            try:
                hash(key)
            except TypeError, exc:
                raise yaml.constructor.ConstructorError('while constructing a mapping',
                    node.start_mark, 'found unacceptable key (%s)' % exc, key_node.start_mark)
            value = self.construct_object(value_node, deep=deep)
            mapping[key] = value
        return mapping


 类似资料:
  • 我有一个像这样的yaml文件 我希望种子被填充为一个列表。 知道怎么做吗?

  • 我正在尝试将yml文件映射到Spring boot应用程序中具有字符串键和PromotionPolicy值的HashMap,并使用默认的Spring boot实现来解析这些值,但当我尝试从映射中读取值时,PromotionPolicy对象只包含所有实例的默认值[0,false,false]。 我的yml是: 我拥有的模型是: 组件java类如下: 尝试在此处显示值: 我的输出如下: 而我希望结果包

  • YAML中的流映射表示键值对的无序集合。 它们也称为映射节点。 请注意,键应保持唯一。 如果流映射结构中存在重复的键,则会生成错误。 键顺序在序列化树中生成。 示例 流映射结构的示例如下所示 - JSON格式的映射序列(无序列表)的输出如下所示 - 如果如上所示观察此输出,则会发现在YAML映射结构中键名称是唯一的。

  • 然后我可以访问index.html,但是当我试图单击链接以使用servlet时,我得到了一个not file错误,说/home/cubouyaka/web/apache-tomcat-8.5.38/webapps/searchengine/servlet/search不存在,但是我在web.xml中进行了映射,所以我不明白为什么我会得到这个错误。 有人能帮帮我吗?我已经浪费了很多时间试图解决这个问

  • 问题内容: 在两个表之间具有映射表的多对多关系中,如何仅加载第二个实体的ID。 以下是解释我要在这里实现的示例。以下是示例架构 注意:为简洁起见,在用户表和页表中还有其他列,此处未包括在内。 用户实体: 我想做的是在类中添加另一个属性,并为此集合中的用户映射所有页面ID。 如何使用Hibernate做到这一点? 问题答案: 在课堂上: 您可以通过遍历返回的集合来获取ID。默认情况下,集合是延迟加载

  • 我刚刚开始看Java8,为了尝试lambdas,我想我应该尝试重写我最近写的一个非常简单的东西。我需要将一个字符串到列的映射转换为另一个字符串到列的映射,其中新映射中的列是第一个映射中列的防御副本。列具有复制构造函数。到目前为止我得到的最接近的数据是: 但我相信一定有更好的方法来做这件事,我会很感激一些建议。