Tenho um arquivo de configuração que (propositalmente) contém alguns aliases indefinidos:
base:
foo: *args_foo
bar: *args_bar
fuz: fuz_val
buz: buz_val
Enquanto isso, tenho um cli que recebe --foo e --bar como argumentos, onde --foo pode ser especificado várias vezes. Acabo com um dict parecido com:
args = {}
args["foo"] = ["foo_val_1", "foo_val_2", "foo_val_3"]
args["bar"] = "bar_val"
Gostaria de despejar os args para yaml, mas com âncoras personalizadas para cada chave em arg. Algo assim:
args:
foo: &args_foo
- foo_val_1
- foo_val_2
- foo_val_3
bar: &args_bar "bar_val"
Eu poderia escrever meu próprio código para gerar o doc, mas eu preferiria de alguma forma dizer ao ruamel.yaml para lidar com a adição das âncoras antes da serialização. A questão é, isso é possível e, se sim, como?
A intenção é então concatenar os dois arquivos assim:
args:
foo: &args_foo
- foo_val_1
- foo_val_2
- foo_val_3
bar: &args_bar "bar_val"
base:
foo: *args_foo
bar: *args_bar
fuz: fuz_val
buz: buz_val
e extrair "base" como a configuração final após carregar o documento concatenado.
Como você não pode carregar seu arquivo de configuração (pois ele é um YAML inválido), o mais fácil, na minha opinião, é gerar um arquivo YAML com as definições de âncora e anexar o arquivo de configuração a ele.
Recomendo primeiro fazer uma viagem de ida e volta da saída esperada:
que dá:
E então analisando
data
, especialmente para os tipos especiais que precisam ser criados (veja também esta resposta ):que dá:
Sua
args
estrutura de dados precisa de alguma elaboração:que dá:
Isso
always_dump
é necessário, pois âncoras falsas normalmente não são descartadas.Agora você pode combinar o acima:
que dá: