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的合并功能,锚定的“类型”需要是一个映射(Pythondict
),该映射的键/值对插入到另一个映射中,插入点如下:
<<: *other
为了使用YAML的合并功能,您锚定的“类型”需要是一个映射(Pythondict
),该映射的键/值对插入到另一个映射中,插入点如下:
<<: *other
我了解映射功能的工作原理,!l2d
tag和l2d\u构造函数
函数将a
序列更改为dict,正如您在生成的python对象中看到的那样。我希望构造器函数从序列到映射的变异意味着我可以像对待yaml中的映射一样对待a
值,但我越来越认为,到那个阶段,解析已经太晚了,是的,
的值。或者您可以替换constructor.py
中的合并工具来做正确的事情。我了解映射功能的工作原理,!l2d
tag和l2d\u构造函数
函数将a
序列更改为dict,正如您在生成的python对象中看到的那样。我希望构造器函数从序列到映射的变异意味着我可以像对待yaml中的映射一样对待a
值,但我越来越认为,到那个阶段,解析已经太晚了,是的,
的值。或者您可以替换constructor.py
中的合并工具,以执行正确的操作。