Как мне сделать PyYAML или ruamel.yaml всегда дамп списков встроенными? Будь то списки элементов YAML, загруженные из существующего файла или добавленные из моего кода.
Когда я загружаю YAML из файла и затем выгружаю его, он выводит списки встроенными (см. Код ниже). Но если я добавлю новый элемент YAML со списками к существующему родительскому объекту, а затем дам дамп, он будет выводить списки, не являющиеся встроенными.
Я пробовал с Python 3.7.3, PyYAML 5.1.1 и ruamel.yaml 0.15.97.
>>> import ruamel.yaml
>>> ruamel.yaml.__version__
'0.15.97'
>>> raw_yaml = """
... users:
... user1:
... comment: comment1
... keys: ["user1 key1", "user1 key2"]
... groups: ["user1 group1", "user1 group2"]
... """
>>> yaml = ruamel.yaml.round_trip_load(raw_yaml, preserve_quotes=True)
>>> dump = ruamel.yaml.round_trip_dump(yaml, default_flow_style=None)
>>> print(dump)
users:
user1:
comment: comment1
keys: ["user1 key1", "user1 key2"]
groups: ["user1 group1", "user1 group2"]
# So far so good, 'keys' and 'groups' are dumped inline
>>> yaml['users']['user2'] = {}
>>> yaml['users']['user2']['comment'] = 'comment2'
>>> yaml['users']['user2']['keys'] = []
>>> yaml['users']['user2']['keys'].append('user2 key1')
>>> yaml['users']['user2']['keys'].append('user2 key2')
>>> yaml['users']['user2']['groups'] = []
>>> yaml['users']['user2']['groups'].append('user2 group1')
>>> yaml['users']['user2']['groups'].append('user2 group2')
>>> dump = ruamel.yaml.round_trip_dump(
... yaml, default_flow_style=False, default_style="'",
... indent=2, block_seq_indent=2)
# desired result:
# users:
# user1:
# comment: comment1
# keys: ["user1 key1", "user1 key2"]
# groups: ["user1 group1", "user1 group2"]
# user2:
# comment: comment2
# keys: ["user2 key1", "user2 key2"]
# groups: ["user2 group1", "user2 group2"]
>>> print(dump)
'users':
'user1':
'comment': 'comment1'
'keys': ["user1 key1", "user1 key2"]
'groups': ["user1 group1", "user1 group2"]
'user2':
'comment': 'comment2'
'keys':
- 'user2 key1'
- 'user2 key2'
'groups':
- 'user2 group1'
- 'user2 group2'
См. Выше, когда я выгружаю только что загруженный YAML (users ['user1']), списки встроены:
keys: ["user1 key1", "user1 key2"]
groups: ["user1 group1", "user1 group2"]
Но когда я добавляю пользователей ['user2'] и затем выгружаю весь объект YAML, списки не являются встроенными:
'keys':
- 'user2 key1'
- 'user2 key2'
'groups':
- 'user2 group1'
- 'user2 group2'
Если я установлю «default_flow_style = True», он будет выгружать весь встроенный элемент:
'user2': {'comment': 'comment2', 'keys': ['user2 key1', 'user2 key2'], 'groups': [ 'user2 group1', 'user2 group2']}
Это не то, что я хочу. Я хочу, чтобы «комментарии», «ключи» и «группы» выводились в отдельных строках со встроенными списками:
user2:
comment: comment2
keys: ["user2 key1", "user2 key2"]
groups: ["user2 group1", "user2 group2"]
Для PyYaml ситуация практически такая же.
Я хочу, чтобы списки всегда сбрасывались внутри строки (как для пользователей ['user1']). Как мне это сделать?