python - Añadiendo comentarios a YAML producidos con PyYaml.
(1)
Probablemente tengas algún representante para la clase MyObj, ya que por dumping ( print(yaml.dump(MyObj()))
) con PyYAML te dará:
!!python/object:__main__.MyObj {}
PyYAML solo puede hacer una cosa con los comentarios en el resultado deseado: descartarlos. Si lees la salida deseada nuevamente, terminas con un dict que contiene un dict ( {''boby'': {''age'': 34}}
, no obtendrás una instancia de MyObj()
porque no hay información de etiqueta)
La versión mejorada para PyYAML que desarrollé ( ruamel.yaml ) se puede leer en YAML con comentarios, conservar los comentarios y escribir comentarios al descargar. Si lee la salida deseada, los datos resultantes se verán (y actuarán) como un dict que contiene un dict, pero en realidad hay una estructura de datos más compleja que puede manejar los comentarios. Sin embargo, puede crear esa estructura cuando ruamel.yaml le pide que voltee una instancia de MyObj
y si agrega los comentarios en ese momento, obtendrá el resultado deseado.
from __future__ import print_function
import sys
import ruamel.yaml
from ruamel.yaml.comments import CommentedMap
class MyObj():
name = "boby"
age = 34
def convert_to_yaml_struct(self):
x = CommentedMap()
a = CommentedMap()
x[data.name] = a
x.yaml_add_eol_comment(''this is the name'', ''boby'', 11)
a[''age''] = data.age
a.yaml_add_eol_comment(''in years'', ''age'', 11)
return x
@staticmethod
def yaml_representer(dumper, data, flow_style=False):
assert isinstance(dumper, ruamel.yaml.RoundTripDumper)
return dumper.represent_dict(data.convert_to_yaml_struct())
ruamel.yaml.RoundTripDumper.add_representer(MyObj, MyObj.yaml_representer)
ruamel.yaml.round_trip_dump(MyObj(), sys.stdout)
Que imprime:
boby: # this is the name
age: 34 # in years
No es necesario esperar para crear las instancias de CommentedMap
hasta que desee representar la instancia de MyObj
. Por ejemplo, convertiría el name
y la age
en propiedades que obtengan / establezcan valores de / en el CommentedMap
apropiado. De esa manera, podría agregar más fácilmente los comentarios antes de yaml_representer
método estático yaml_representer
para representar la instancia de MyObj
.
Estoy creando documentos Yaml a partir de mis propios objetos python usando PyYaml. por ejemplo mi objeto:
class MyObj(object):
name = "boby"
age = 34
se convierte en:
boby:
age: 34
Hasta ahora tan bueno.
Pero no he encontrado una manera de agregar comentarios al yaml producido de manera programática para que se vea como:
boby: # this is the name
age: 34 # in years
Mirando la documentación de PyYaml y también el código, no encontré ninguna forma de hacerlo.
¿Alguna sugerencia?