如何使用python以github操作的格式将字符串列表写入yaml文件

nos*_*nos 3 python formatting yaml github-actions

pythonyaml包(版本 5.1.2)能够正确加载以下文件,即使该列表不是用前导编写的-

xx: [x1, x2]
yy: [y1, y2, y3]
Run Code Online (Sandbox Code Playgroud)

加载代码如下

import yaml

with open('some file') as f:
    data = yaml.load(f, Loader=yaml.FullLoader)
Run Code Online (Sandbox Code Playgroud)

此格式用于 github actions 配置 yaml 文件。例如,

on: [push, pull_request]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [2.7, 3.5, 3.6, 3.7, 3.8]
        os: [ubuntu-16.04, ubuntu-18.04]
        node: [6, 8, 10]
Run Code Online (Sandbox Code Playgroud)

但是当我data使用 写入文件时yaml.dump(data, f),它采用-约定,即

xx:
- x1
- x2
yy:
- y1
- y2
- y3
Run Code Online (Sandbox Code Playgroud)

有没有办法强制它变成类似 github-actions 的格式?

有人告诉我default_flow_style,但它并没有给出我想要的。

yaml.dump({"A":[1,2,3],"B":[4,5,6]},default_flow_style=True)
Run Code Online (Sandbox Code Playgroud)

输出是'{A: [1, 2, 3], B: [4, 5, 6]}\n'

nos*_*nos 5

正如@Tsyvarev 所指出的,我想要的行为可以通过以下方式触发

yaml.dump({"A":[1,2,3],"B":[4,5,6]}, default_flow_style=None)
Run Code Online (Sandbox Code Playgroud)

官方文档似乎没有定义这种None行为:

默认情况下,PyYAML 根据集合是否具有嵌套集合来选择集合的样式。如果集合有嵌套集合,它将被分配块样式。否则就会有流动的风格。

如果您希望集合始终以块样式序列化,请将参数设置default_flow_style of dump()False