Diferentes representaciones de matrices YAML.

Estoy escribiendo un convertidor de tipo de archivo utilizando Python y PyYAML para un proyecto en el que estoy traduciendo desde y hacia archivos YAML varias veces. A continuación, estos archivos son utilizados por un servicio independiente sobre el que no tengo control, por lo que debo volver a traducir el YAML de la misma forma en que lo obtuve originalmente. Mi archivo original tiene secciones de lo siguiente:

key: - value1 - value2 - value3 

Lo que se evalúa como {key: [value1,value2,value3]} usando yaml.load() . Cuando traduzco esto de nuevo a YAML, mi nuevo archivo se lee así:

 key: [value1,value2,value3] 

Mi pregunta es si estas dos formas son equivalentes en lo que respecta a los analizadores de varios idiomas de los archivos YAML. Obviamente, al usar PyYaml, estos son equivalentes, pero ¿esto es cierto para Ruby u otros idiomas, que utiliza la aplicación? Si no, la aplicación no podrá mostrar los datos correctamente.

Sí, para cualquier analizador YAML que siga la especificación, son equivalentes. Puede leer la especificación aquí: http://www.yaml.org/spec/1.2/spec.html

La sección 3.2.3.1 es particularmente relevante (énfasis mío):

3.2.3.1. Estilos de nodo

Cada nodo se presenta en algún estilo , dependiendo de su tipo. El estilo del nodo es un detalle de la presentación y no se refleja en el árbol de serialización ni en el gráfico de representación. Hay dos grupos de estilos. Los estilos de bloque usan sangría para denotar estructura; En contraste, los estilos de flujo se basan en indicadores explícitos.

Para aclarar, un nodo es cualquier estructura en YAML, incluidas las matrices (llamadas secuencias en la especificación). El estilo de una sola línea se denomina secuencia de flujo (consulte la sección 7.4.1) y el estilo multilínea se denomina secuencia de bloques (sección 8.2.1). Un analizador compatible deserializará ambos en objetos idénticos.

Como Jordan ya señaló, el estilo de nodo es un detalle de serialización. Y la salida es equivalente a su entrada.

Con PyYAML, puede obtener la misma salida de estilo de bloque utilizando la palabra clave default_flow_style al volcar:

 yaml.dump(yaml.load("""\ key: - value1 - value2 - value3 """), sys.stdout, default_flow_style=False) 

te dio:

 key: - value1 - value2 - value3 

Si utilizaría las capacidades de ida y vuelta de ruamel.yaml (descargo de responsabilidad: yo soy el autor de ese paquete), podría hacerlo:

 import sys import ruamel.yaml as yaml yaml_str = """\ key: - value1 - value2 # this is the second value - value3 """ data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader) yaml.dump(data, sys.stdout, Dumper=yaml.RoundTripDumper, default_flow_style=False) 

Llegar:

 key: - value1 - value2 # this is the second value - value3 

No solo conserva el estilo de flujo / bloque, sino también el comentario y el orden de las claves y algunos de forma más transparente. Esto hace que la comparación (por ejemplo, cuando se usa algún sistema de control de revisión para registrar el archivo YAML), sea mucho más fácil.

Para el servicio que lee el archivo YAML, todo esto no hace ninguna diferencia, pero para la facilidad de verificar si está transformando las cosas correctamente, lo hace.