我现在有点被皮亚姆搞糊涂了。我在我的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。你知道吗
有人告诉我为什么会这样吗?你知道吗
首先,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没有。你知道吗
如果您需要两个版本的行为相同,我建议您显式地对键进行排序:
如果您真的需要按照密钥在YAML文档中的顺序获取密钥,我建议您查看ruamel.yaml(免责声明:我是yaml1.2兼容包的作者)并执行。e、 g.:
它将获得python2.7到3.7的输出,就像python3.6.5一样。(英寸鲁阿迈尔.亚马尔默认情况下,执行
yaml.load()
是安全的)。你知道吗相关问题 更多 >
编程相关推荐