Quero criar dados em python e gravá-los em um arquivo como um documento yaml usando âncoras e mesclagens na saída.
Acredito que isso seria possível com o ruamel YAML, porque, conforme descrito nos exemplos oficiais do ruamels :
- ele pode carregar documentos yaml com âncoras e mesclar de forma transparente (transparente no sentido de que o acesso aos dados é o mesmo, seja definido por meio de âncoras ou não)
- ele pode fazer o roundtrip de arquivos yaml enquanto preserva âncoras (então carregar um arquivo yaml que inclui âncoras pode ser lido e reescrito no disco e ainda ter âncoras)
Isso significa que ruamel.yaml deve ter uma representação interna do yaml-data que inclua e entenda âncoras (ao contrário do PyYAML, que apenas lê âncoras, mas não as preserva). Não parece haver uma maneira documentada de criar tais âncoras a partir do código python.
O arquivo mais minimalista que eu quero criar seria algo como isto:
base: &ANCHOR
x: 1
object:
<<: *ANCHOR
y: 2
Quando você faz o ida e volta dos seus dados usando o seguinte programa:
você vê que a saída corresponde à entrada:
Você poderia realmente criar uma nova
YAML
instância para dumping e ainda obter a mesma saída. Isso significa que as informações sobre âncoras e mesclagem estão em algum lugar na estrutura de dados emdata
. Então você deve inspecionar vários itens.que dá:
O acima é normalmente um processo incremental (mesmo para mim, que tenho algum conhecimento sobre os internos). E ajuda olhar para a fonte, especialmente
construct_mapping
emconstructor.py
eCommentedMap
emcomments. py
Com as informações acima, vamos primeiro lidar com a âncora (você pode ter mesclagens sem âncora/alias, mas elas não fazem muito sentido).
que dá:
A criação da chave de mesclagem pode ser feita definindo-a
CommentedMap
apenas com ay
chave e adicionando omerge
atributo:que dá:
.merge
atributo0
, o inteiro determina a ordenação.Fixe a versão que
ruamel.yaml
você está usando. Internos como esses mudarão sem aviso prévio