【发布时间】:2018-09-02 07:59:12
【问题描述】:
我正在尝试输出,然后从 YAML 解析回以下内容
import numpy as np
class MyClass(object):
YAMLTag = '!MyClass'
def __init__(self, name, times, zeros):
self.name = name
self._T = np.array(times)
self._zeros = np.array(zeros)
YAML 文件看起来像
!MyClass:
name: InstanceId
times: [0.0, 0.25, 0.5, 1.0, 2.0, 5.0, 10.0]
zeros: [0.03, 0.03, 0.04, 0.03, 0.03, 0.02, 0.03]
为了写,我在类中添加了两个方法
def toDict(self):
return {'name' : self.name,
'times' : [float(t) for t in self._T],
'zeros' : [float(t) for t in self._zeros]}
@staticmethod
def ToYAML(dumper, data):
return dumper.represent_dict({data.YAMLTag : data.toDict()})
阅读方法
@staticmethod
def FromYAML(loader, node):
nodeMap = loader.construct_mapping(node)
return MyClass(name = nodeMap['name'],
times = nodeMap['times'],
zeros = nodeMap['zeros'])
在YAML Documentation之后,我在同一个Python文件myClass.py中添加了以下sn-p:
import yaml
yaml.add_constructor(MyClass.YAMLTag, MyClass.FromYAML)
yaml.add_representer(MyClass, MyClass.ToYAML)
现在,写作似乎工作正常,但阅读 YAML,代码
loader.construct_mapping(node)
似乎返回带有空数据的字典:
{'zeros': [], 'name': 'InstanceId', 'times': []}
我应该如何修复阅读器才能正确执行此操作?或者也许我没有写出正确的东西?我花了很长时间查看 PyYAML 文档并通过包的实现方式进行调试,但无法找到解析复杂结构的方法,而我似乎找到的唯一示例有一个易于解析的 1 行类。
更新
按如下方式手动解析节点:
name, times, zeros = None, None, None
for key, value in node.value:
elementName = loader.construct_scalar(key)
if elementName == 'name':
name = loader.construct_scalar(value)
elif elementName == 'times':
times = loader.construct_sequence(value)
elif elementName == 'zeros':
zeros = loader.construct_sequence(value)
else:
raise ValueError('Unexpected YAML key %s' % elementName)
但问题仍然存在,有没有一种非手动的方法可以做到这一点?
【问题讨论】:
-
是否有特殊原因需要与 YAML 1.1 兼容并因此使用 PyYAML?
-
@Anthon 我需要使用 PyYAML,因为这是系统已经使用的解析器。你还有其他更现代的建议吗?我可能会考虑在某个时候升级系统
标签: python python-2.7 yaml pyyaml