То, что вы пытаетесь сделать, невозможно с обычными параметрами, которые вы можете передать PyYAML dump()
,
который дает вам только очень контроль курса, используя default_flow_style
True
: все в стиле потока (как в JSON)
False
: все в стиле блока
None
: коллекции листьев имеют стиль потока, а стиль остальных блоков
Вы ссылаетесь, что YAML имеет обе коллекции листов в стиле блока: значение
для ключа metadata
, а также коллекций листов в стиле потока:
значение для ключа verbs
. Без взлома представителя вы не сможете
добиться этого в PyYAML.
Более простой способ создания YAML в вашей конкретной форме - это
чтение-изменение-запись ожидаемого YAML с парсером, который знает, как
сохранить форматирование. Вы можете сделать это с ruamel.yaml
, который
специально разработанный для сохранения таких вещей (отказ от ответственности: I
я являюсь автором этого пакета).
Если ваш входной файл input.yaml
:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace:
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", 'list']
(единственная запись под metadata
специально, но вы можете указать оба, или ни одного, если
Вы назначаете вместо обновления)
и следующая программа:
import sys
from pathlib import Path
import ruamel.yaml
yaml_str = """\
"""
in_file = Path("input.yaml")
out_file = Path("output.yaml")
team_name = "default"
group_user = "pod-reader"
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(in_file)
data["metadata"].update(dict(namespace=team_name, name=group_user))
yaml.dump(data, out_file)
дает output.yaml
:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", 'list']
Обратите внимание, что помимо стиля блока / потока также есть одинарные / двойные кавычки
от оригинала и комментарий сохранились. Ваш отступ
уже совпадает со значением по умолчанию, так что не установлен Explicity (yaml.indent(mapping=2, sequence=2, offset=0)
).