繁体   English   中英

ruamel.yaml 和 yamllint 序列缩进冲突

[英]ruamel.yaml and yamllint conflict on sequence indentation

我有以下 YAML:

root:
  - foo:
    - bar: 1
    - baz: 2

当我使用ruamel.yaml (和offset=2, sequence=4配置)读取/转储时,我得到以下结果:

root:
  - foo:
      - bar: 1
      - baz: 2

并不理想,但我想这就是ruamel.yaml的工作方式并且无法更改它(我更愿意将相同的 output 作为输入;如果可能的话那将是最好的)。

无论如何,问题是当我运行yamllint并且我得到:

error 错误的缩进:预期为 4 但找到了 6(缩进)

我猜这是因为 Python 的yaml解析器从父连字符的正下方开始计数,而ruamel.yaml没有。

知道如何使它们都起作用吗?

我试着玩yamllint配置但没有运气。

您始终需要一个至少比偏移量大两倍的sequence值(假设这是序列缩进的缩写)。 二,因为需要两个位置:一个用于(块)序列指示符( - )和后面的必要空格。

当您有一个块序列是映射键“xyz”的值时,您可以放弃通常必需的缩进并将序列指示符与键的第一个字符对齐:

xyz:
- 1
- 2

这就是 ruamel yaml 的默认设置,这也是您使用sequence=2offset=0获得的设置。

您的原件缩进不一致。 key root的值是一个序列缩进为4且偏移量为2的块序列。 但是,键foo的值是序列缩进2 ,偏移量为0 这是您无法使用ruamel.yaml生成的内容,因为它不允许您为不同键的值指定不同的缩进值,从而使缩进保持一致。

您得到的结果对于sequence=4, offset=2是正确的,因为foo中的froot中的r之后的 4 个位置开始,而bar中的b也在 foo 中的f之后的 4 个位置。

如果你使用了默认的或指定的sequence=2, offset=0你会得到(同样一致):

root:
- foo:
  - bar: 1
  - baz: 2

foo向左移动了 2 个位置, bar向左移动了 4 个位置(2 个用于它自己,另外两个因为作为root值的整个序列移动了 2)。

我不知道 yamllint 是如何工作的,但是如果你从四行示例结果中得到那个错误,那么很明显它从r' from root to f of foo and then starts counting for the from bar starting at the foo before的 - 开始(instead of at the f` 开始。这是 IMO 不正确的。

如果您在上面给出我的示例,您可以尝试看看yamllint做了什么。 由于两个缩进都减少了 2,它应该抱怨:

error 错误的缩进:预期为 2 但找到了 4(缩进)

如果它没有抱怨,请使用ruamel.yaml的设置。 如果它没有或者它接受你的原始和我的sequence=2, offset=0示例,你可能应该尝试为 YAML 找到一个更一致的 linting 工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM