python yaml pyyaml

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?