Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyYAML没有解析所有示例_Python_Yaml_Pyyaml - Fatal编程技术网

Python PyYAML没有解析所有示例

Python PyYAML没有解析所有示例,python,yaml,pyyaml,Python,Yaml,Pyyaml,我正试图理解关于这一点的主张: 如果您转到使用PyYAML的在线YAML解析器,那么从规范中获取的一些示例将不起作用 我知道您需要为其中一些故障定义标记,并且在线解析器只能处理单个文档YAML,我知道在使用PyYAML时如何修复这一问题 但示例11也失败了,它没有特殊的标记,是一个单独的文档。PyYAML怎么能声称它能解析所有的例子,而它显然不能?这是因为PyYAML是针对YAML 1.1的,并且示例来自YAML 1.2规范吗?从您的最后一个问题开始:这不是因为示例 来自后面的规范。假设你把自己

我正试图理解关于这一点的主张:

如果您转到使用PyYAML的在线YAML解析器,那么从规范中获取的一些示例将不起作用

我知道您需要为其中一些故障定义标记,并且在线解析器只能处理单个文档YAML,我知道在使用PyYAML时如何修复这一问题


但示例11也失败了,它没有特殊的标记,是一个单独的文档。PyYAML怎么能声称它能解析所有的例子,而它显然不能?这是因为PyYAML是针对YAML 1.1的,并且示例来自YAML 1.2规范吗?

从您的最后一个问题开始:这不是因为示例 来自后面的规范。假设你把自己限制在 规范中的预览章节和在线解析器一样, 考虑到我只是比较了这些例子 视觉上,即不以字符为单位,示例 第2章/第2节的1.2和1.1规范中的内容相同

您的误解来自于在文档中使用单词解析器 联机解析器的标题。它实际上要做的是加载 然后转储到JSON、Python或规范化YAML。装货 Pyaml由YAML中图片中提到的阶段组成 规格与1.1和1.2相同,从基于字符的 文档:解析、合成和构造步骤

PyYAML在解析步骤上没有失败,它在构造上失败了 步骤,因为as@torek表示PyYAML构造了一个列表 不能用作Python dict的键。这是一个 Python的dict实现和IMO的限制是PyYAML的缺陷之一

import sys
import yaml as pyyaml

yaml_1_1_example_2_11 = """\
? - Detroit Tigers
  - Chicago cubs
:
  - 2001-07-23

? [ New York Yankees,
    Atlanta Braves ]
: [ 2001-07-02, 2001-08-12,
    2001-08-14 ]
"""

for event in pyyaml.parse(yaml_1_1_example_2_11):
    print(event)
给出:

StreamStartEvent()
DocumentStartEvent()
MappingStartEvent(anchor=None, tag=None, implicit=True)
SequenceStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='Detroit Tigers')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='Chicago cubs')
SequenceEndEvent()
SequenceStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='2001-07-23')
SequenceEndEvent()
SequenceStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='New York Yankees')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='Atlanta Braves')
SequenceEndEvent()
SequenceStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='2001-07-02')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='2001-08-12')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value='2001-08-14')
SequenceEndEvent()
MappingEndEvent()
DocumentEndEvent()
StreamEndEvent()
所以PyYAML可以正确地解析这个。不仅如此,如果在线解析器 当发出规范的YAML时,它不会尝试加载然后转储 处理此示例,替换上面的最后两行 代码:

因此:

---
{
  ? [
    ! "Detroit Tigers",
    ! "Chicago cubs",
  ]
  : [
    ! "2001-07-23",
  ],
  ? [
    ! "New York Yankees",
    ! "Atlanta Braves",
  ]
  : [
    ! "2001-07-02",
    ! "2001-08-12",
    ! "2001-08-14",
  ],
}
声明PyYAML解析所有示例,就像我声明我可以 读希腊语。我早在70年代就学会了希腊字母,所以我能 读希腊字母,但我不懂它们组成的单词

在ruamel.yaml免责声明中:我是这个包的作者,您可以加载这个示例,甚至可以使用PyYAML 转储加载的数据

from pprint import pprint
import ruamel.yaml
import yaml as pyyaml

yaml = ruamel.yaml.YAML(typ='safe')
data = yaml.load(yaml_1_1_example_2_11)
pprint(data)
print('*' * 50)
yaml.dump(data, sys.stdout)
print('*' * 50)
pyyaml.safe_dump(data, sys.stdout)
因此:

{('Detroit Tigers', 'Chicago cubs'): [datetime.date(2001, 7, 23)],
 ('New York Yankees', 'Atlanta Braves'): [datetime.date(2001, 7, 2),
                                          datetime.date(2001, 8, 12),
                                          datetime.date(2001, 8, 14)]}
**************************************************
? [Detroit Tigers, Chicago cubs]
: [2001-07-23]
? [New York Yankees, Atlanta Braves]
: [2001-07-02, 2001-08-12, 2001-08-14]
**************************************************
? [Detroit Tigers, Chicago cubs]
: [2001-07-23]
? [New York Yankees, Atlanta Braves]
: [2001-07-02, 2001-08-12, 2001-08-14]

这是因为。。。这些示例来自[稍后的]规范?大概是的。实际的失败是键不可散列pyyaml将键读入列表而不是元组。也许pyyaml应该注意到键被用作键,并对其进行元组化,尽管很难完全通用。@torek至少在第二章中,这些规范的示例是相同的,但您对它为什么不加载的分析是正确的:pyyaml在遇到键序列时不会创建元组。当使用映射作为键时,它也会失败,它应该创建一个hashable collections.abc.mapping。正如Anthon所说,PyYAML无法生成列表元组作为键,但我正在研究它,希望它能在下一个版本中出现。然后它还可以使用嵌套元组作为键。
from pprint import pprint
import ruamel.yaml
import yaml as pyyaml

yaml = ruamel.yaml.YAML(typ='safe')
data = yaml.load(yaml_1_1_example_2_11)
pprint(data)
print('*' * 50)
yaml.dump(data, sys.stdout)
print('*' * 50)
pyyaml.safe_dump(data, sys.stdout)
{('Detroit Tigers', 'Chicago cubs'): [datetime.date(2001, 7, 23)],
 ('New York Yankees', 'Atlanta Braves'): [datetime.date(2001, 7, 2),
                                          datetime.date(2001, 8, 12),
                                          datetime.date(2001, 8, 14)]}
**************************************************
? [Detroit Tigers, Chicago cubs]
: [2001-07-23]
? [New York Yankees, Atlanta Braves]
: [2001-07-02, 2001-08-12, 2001-08-14]
**************************************************
? [Detroit Tigers, Chicago cubs]
: [2001-07-23]
? [New York Yankees, Atlanta Braves]
: [2001-07-02, 2001-08-12, 2001-08-14]