PyYAML在不同的环境中表现不同

2024-03-29 01:10:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在有点被皮亚姆搞糊涂了。我在我的Windows和Linux系统上安装了3.12版本,并且看到它在排序值时的行为不同。你知道吗

让我们看看这个YAML文件示例:

functions:
    function_a:
        value_1: 1
        value_2: 1
        value_3: 1
    function_c:
        value_1: 1
        value_2: 1
        value_3: 1
    function_d:
        value_1: 1
        value_2: 1
        value_4: 1
    function_b:
        value_1: 1
        value_2: 1
        value_3: 1

通过conf = yaml.load(fp)像往常一样加载YAML文件。你知道吗

现在,这两个系统之间真正奇怪的是,当我尝试遍历所有函数时,两个操作系统的顺序都不同。你知道吗

在Windows上:

import yaml
with open('myyamlfile.yml') as fp:
    conf = yaml.load(fp)
for function in conf['functions']:
    print(function)

function_a
function_c
function_d
function_b

在Linux上,它是按顺序提供的:

import yaml
with open('myyamlfile.yml') as fp:
    conf = yaml.load(fp)
for function in conf['functions']:
    print(function)

function_a
function_b
function_c
function_d

我真的不知道为什么。我在两台具有相同模块版本的机器上使用相同的代码。这两台机器之间唯一的区别是操作系统,在Windows上我使用3.6.5,在Linux上我使用3.4.8。你知道吗

有人告诉我为什么会这样吗?你知道吗


Tags: 文件import版本yaml顺序valuelinuxwindows
1条回答
网友
1楼 · 发布于 2024-03-29 01:10:43

首先,YAML规范(PyYAML所基于的旧1.1规范和更新的1.2规范(2009))表明映射的键是无序的。所以,你不应该依赖于一个命令后,装载到那里。你知道吗

当然,还有一点不同,那就是Python 3.6 dicts are ordered(在CPython实现中,在其他实现中,这是从3.7开始的),而python3.6之前的dict没有排序。PyYAML创建一个dict并按照从YAML文档中读取键的顺序填充它,因此3.6.5版本获得键插入的顺序,而3.4.8没有。你知道吗


如果您需要两个版本的行为相同,我建议您显式地对键进行排序:

for function in sort(conf['functions']):

如果您真的需要按照密钥在YAML文档中的顺序获取密钥,我建议您查看ruamel.yaml(免责声明:我是yaml1.2兼容包的作者)并执行。e、 g.:

import pathlib
import ruamel.yaml

yaml = ruamel.yaml.YAML()
file_name = pathlib.Path('myfile.yaml')
conf = yaml.load(file_name)
for function in conf['functions']:
    print(function)

它将获得python2.7到3.7的输出,就像python3.6.5一样。(英寸鲁阿迈尔.亚马尔默认情况下,执行yaml.load()是安全的)。你知道吗

相关问题 更多 >