gpt4 book ai didi

python - PyYAML yaml.dump() 为字符串键 > 122 个字符生成复杂键?

转载 作者:太空宇宙 更新时间:2023-11-04 03:30:49 26 4
gpt4 key购买 nike

使用 PyYAML 3.11 和 Python 2.7.6,让我们转储一个简单的字典,它只有一个字符串键(长度为 122 个字符),映射到值“1”:

>>> print yaml.dump({'12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012': 1})
{'12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012': 1}

正如预期的那样工作 - 简单、人类可读的 YAML。但现在让我们将该字符串键的长度增加到 123 个字符。现在 PyYAML 创建一个人类可读性较差的复杂键,以“?”开头,并将值“1”分流到新行:

>>> print yaml.dump({'123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123': 1})
{? '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123'
: 1}

为什么 PyYAML 会这样做?有什么办法可以禁用该行为吗?根据字符串键的长度,这会导致我转储的 YAML 代码缺乏视觉一致性。

最佳答案

您获得显式 key 标记 ? 的原因是您超出了简单 key 的长度限制。这在发射器中的函数中与 128 进行了比较(隐式标记 !!str 的长度将其推过该阈值)。您可以重写检查键的完整函数使其变得简单,但没有简单的方法可以做到这一点,因为值是硬编码在函数中的。

我一直无法在 YAML spec 中找到这个特定阈值的原因。在 PyYAML 源代码中也没有,因为在解析器端它能够处理如此长的键(有或没有 ?)。

ruamel.yaml ¹ 中,您可以通过更改转储程序实例来更改阈值:

from __future__ import print_function

import sys
import ruamel.yaml as yaml

yaml_str = """\
- {'123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123': 1}
"""

data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
dumper = yaml.RoundTripDumper
print('MAX_SIMPLE_KEY_LENGTH', dumper.MAX_SIMPLE_KEY_LENGTH)

yaml.dump(data, sys.stdout, Dumper=dumper)
dumper.MAX_SIMPLE_KEY_LENGTH = 256
print('After raising the threshold:')
yaml.dump(data, sys.stdout, Dumper=dumper)

会给你:

MAX_SIMPLE_KEY_LENGTH 128
- {? '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123'
: 1}
After raising the threshold:
- {'123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123': 1}

因为我通常在 80 列的终端窗口上工作,所以我仍然发现很长的键很难阅读,当然是 YMMV。尤其是在往返 YAML 时,需要精确控制何时以这种方式更改 key 。

¹ 免责声明:我是 PyYAML 增强版的作者。

关于python - PyYAML yaml.dump() 为字符串键 > 122 个字符生成复杂键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31197268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com