Я пытаюсь вывести, а затем проанализировать из 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, я добавил следующий фрагмент в тот же файл Python myClass.py
:
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 и отладку того, как реализован пакет, но не могу понять, как разобрать сложную структуру, и единственный пример, который я, кажется, нашел, имеет однострочный класс, который легко разбирается.
Связано: синтаксический анализ YAML и Python
ОБНОВЛЕНИЕ
Разбор узла вручную работал следующим образом:
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)
Но вопрос все еще остается, есть ли способ сделать это не вручную?