Python 使用pyyaml或ruamel.yaml构造函数作为别名的achor

Python 使用pyyaml或ruamel.yaml构造函数作为别名的achor,python,yaml,pyyaml,ruamel.yaml,Python,Yaml,Pyyaml,Ruamel.yaml,我试图在别名中使用通过构造函数传递的锚定数据,但别名希望使用构造函数前的数据 我从安顿那里得到了灵感,但仍然没有找到快乐 下面是一些示例代码: class L2D(dict): def __repr__(self): return('L2D({})'.format(dict.__repr__(self))) def l2d_constructor(loader, node): print("constructing") instance = L2D.__

我试图在别名中使用通过构造函数传递的锚定数据,但别名希望使用构造函数前的数据

我从安顿那里得到了灵感,但仍然没有找到快乐

下面是一些示例代码:

class L2D(dict):
    def __repr__(self):
        return('L2D({})'.format(dict.__repr__(self)))

def l2d_constructor(loader, node):
    print("constructing")
    instance = L2D.__new__(L2D)
    yield instance
    state = loader.construct_sequence(node, deep=True)
    instance.__init__(state)

yaml.add_constructor(u'!l2d', l2d_constructor)

print(yaml.load('''
a: !l2d
  - [e, f]
  - [g, h]
'''))

print("============")

print(yaml.load('''
a: &other !l2d
  - [e, f]
  - [g, h]
b:
  <<: *other
  a: b
  c: d
'''))
相反,我得到了

constructing
Traceback (most recent call last):
  File "test2.py", line 41, in <module>
    '''))
  File "/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site-packages/ruamel/yaml/main.py", line 86, in load
    return loader.get_single_data()
  File "/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site-packages/ruamel/yaml/constructor.py", line 56, in get_single_data
    return self.construct_document(node)
  File "/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site-packages/ruamel/yaml/constructor.py", line 65, in construct_document
    for dummy in generator:
  File "/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site-packages/ruamel/yaml/constructor.py", line 494, in construct_yaml_map
    value = self.construct_mapping(node)
  File "/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site-packages/ruamel/yaml/constructor.py", line 265, in construct_mapping
    self.flatten_mapping(node)
  File "/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site-packages/ruamel/yaml/constructor.py", line 240, in flatten_mapping
    % subnode.id, subnode.start_mark)
ruamel.yaml.constructor.ConstructorError: while constructing a mapping
  in "<unicode string>", line 8, column 3:
      <<: *other
      ^ (line: 8)
expected a mapping for merging, but found sequence
  in "<unicode string>", line 5, column 5:
      - [e, f]
        ^ (line: 5)
构造
回溯(最近一次呼叫最后一次):
文件“test2.py”,第41行,在
'''))
文件“/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site packages/ruamel/yaml/main.py”,第86行,已加载
返回加载器。获取单个数据()
文件“/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site packages/ruamel/yaml/constructor.py”,第56行,在get_single_数据中
返回自我构造文档(节点)
文件“/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site packages/ruamel/yaml/constructor.py”,第65行,在施工文件中
对于发电机中的假人:
文件“/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site packages/ruamel/yaml/constructor.py”,第494行,位于Construction\u yaml\u地图中
value=self.construct\u映射(节点)
文件“/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site packages/ruamel/yaml/constructor.py”,第265行,在构造映射中
自展平映射(节点)
扁平映射中的文件“/tmp/tmp.1oRXCix7X3/venv/lib/python3.5/site packages/ruamel/yaml/constructor.py”,第240行
%subnode.id,subnode.start(标记)
ruamel.yaml.constructor.ConstructorError:在构造映射时
在“”第8行第3列中:

为了使用YAML的合并功能,锚定的“类型”需要是一个映射(Python
dict
),该映射的键/值对插入到另一个映射中,插入点如下:

<<: *other

为了使用YAML的合并功能,您锚定的“类型”需要是一个映射(Python
dict
),该映射的键/值对插入到另一个映射中,插入点如下:

<<: *other

我了解映射功能的工作原理,
!l2d
tag和
l2d\u构造函数
函数将
a
序列更改为dict,正如您在生成的python对象中看到的那样。我希望构造器函数从序列到映射的变异意味着我可以像对待yaml中的映射一样对待
a
值,但我越来越认为,到那个阶段,解析已经太晚了,
是的,
的值。或者您可以替换
constructor.py
中的合并工具来做正确的事情。我了解映射功能的工作原理,
!l2d
tag和
l2d\u构造函数
函数将
a
序列更改为dict,正如您在生成的python对象中看到的那样。我希望构造器函数从序列到映射的变异意味着我可以像对待yaml中的映射一样对待
a
值,但我越来越认为,到那个阶段,解析已经太晚了,
是的,
的值。或者您可以替换
constructor.py
中的合并工具,以执行正确的操作。