- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试理解关于 https://pyyaml.org/wiki/PyYAML 的声明那:
PyYAML features
- a complete YAML 1.1 parser. In particular, PyYAML can parse all
examples from the specification.
如果您转到使用 PyYAML (http://yaml-online-parser.appspot.com/) 的在线 YAML 解析器,那么从规范中获取的几个示例不起作用。
我知道您需要为其中一些失败定义标签,并且在线解析器只能处理单个文档 YAML,我知道在使用 PyYAML 时如何“修复”这个问题。
但是示例 11 也失败了,它没有特殊标签并且是单个文档。 PyYAML 怎么能声称它可以解析所有示例,而它显然不能解析?这是因为 PyYAML 适用于 YAML 1.1 而示例来自 YAML 1.2 规范吗?
最佳答案
从你的最后一个问题开始:这不是因为例子来自后来的规范。假设你限制自己规范中的预览章节/部分(在线解析器也是如此),考虑到我只比较了例子视觉上(即不是基于字符的字符),示例在第 2 章/第 2 节的 1.2 和 1.1 规范中是相同的。
您的误解来自于在在线解析器的标题。它实际上试图做的是加载YAML,然后转储到 JSON、Python 或规范的 YAML。 正在加载PyYAML 由 ProcessingOverview 中提到的阶段组成YAML 中的图片规范(1.1 和 1.2 相同),以字符为基础文档:解析、组合和构造步骤。
PyYAML 不会在解析步骤上失败,它会在构造上失败步骤,因为(正如@torek 指出的那样)PyYAML 构造了一个 list
和不能用作 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 时,它可以处理这个例子(替换上面的最后两行代码):
pyyaml.emit(pyyaml.parse(yaml_1_1_example_2_11), stream=sys.stdout, canonical=True)
如下所示:
---
{
? [
! "Detroit Tigers",
! "Chicago cubs",
]
: [
! "2001-07-23",
],
? [
! "New York Yankees",
! "Atlanta Braves",
]
: [
! "2001-07-02",
! "2001-08-12",
! "2001-08-14",
],
}
声明 PyYAML 解析所有示例,就像我声明我可以读希腊文。我在 70 年代学过希腊字母表,所以我可以阅读 (the) Greek (characters),但我不理解它们组成的单词。
在 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]
关于python - PyYAML 不解析所有示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53995421/
我想在我的 pip 项目中使用 PyYaml,但在将其用作依赖项时遇到了麻烦。主要问题是 pip 中的 PyYaml 不是跨平台安装。 如何使用 pip 安装 pyyaml 以使其正常工作。请注意,在
这个问题在这里已经有了答案: Pip install from pypi works, but from testpypi fails (cannot find requirements) (2 个回
我想用 PyYaml 解释以下 YAML 字符串: - !Table header: - !Column - !Paragrap
yaml.load将数字加载为 Python 浮点数。我找不到一种直接的方法来覆盖它。 比较 json.load , 允许 parse_float=Decimal如果你想将浮点数解析为 decimal
我认为加载 .yml file 时出现内存泄漏使用库 PyYAML。 我已按照以下步骤操作: import yaml d = yaml.load(open(filename, 'r')) 进程使用的内
我需要使用 pyyaml 将 dict 导出到 yaml,不带“-” export_dash_dict = {} export_dash_dict["dashboards"] = []
在下面的代码中,我创建了 net_plan_dict 变量字典并将其转换为 YAML 格式文件。在字典中,我有一个名为 addresses 的字段,它是一个包含三个元素的数组。创建 YAML 文件后,
我构建 libyaml 并将其安装到本地区域: yaml-0.1.5 $ ./configure --prefix=/usr/local/sqlminus yaml-0.1.5 $ make inst
这个问题已经有答案了: New PyYAML version breaks on most custom python objects - RepresenterError (1 个回答) 已关闭 5
我正在尝试理解关于 https://pyyaml.org/wiki/PyYAML 的声明那: PyYAML features - a complete YAML 1.1 parser. In part
看起来好像 PyYAML 将字符串 10:01 解释为以秒为单位的持续时间: import yaml >>> yaml.load("time: 10:01") {'time': 601} 官方文档没有
尝试获取 YAML 文档以解析为我可以操作的 python 字典对象。我安装了 pip install pyyaml。 import yaml yamlstring = "some: var \n a
所以我有一个 yaml 文件,里面有很多琐碎的问题和一个答案列表。但是,每当我尝试加载此文件并使用 pyyaml 将内容转储到 python 中时,它都会向后转储它们。我不确定这是我的 yaml 文件
当用很长的键转储字典时,我得到这样的结果: ? ns=4;s=|var|CODESYS Control for Raspberry Pi SL.Application.GVL.Data.DateTim
我想将一些配置参数从 YAML 直接映射到 Python 参数名称。只是想知道是否有一种方法无需编写额外代码(之后修改键)让 YAML 解析器用下划线“_”替换键中的破折号“-”。 some-para
这个问题在这里已经有了答案: Parsing YAML, return with line number (4 个答案) 关闭 1 年前。 有什么方法可以配置 PyYAML 以便我可以获得与给定节点
我有以下 Python 2.6 程序和 YAML 定义(使用 PyYAML ): import yaml x = yaml.load( """ product:
我有以下 YAML 文件: --- my_vars: my_env: "dev" my_count: 3 当我用 PyYAML 读取它并再次转储它时,我得到以下输出: --- my_vars:
我正在开发一个使用 Unity3D 游戏引擎的项目。对于某些管道要求,最好能够使用 Python 从外部工具更新某些文件。 Unity 的 meta 和 anim 文件在 YAML 中,所以我认为使用
我有一个 python 项目,我想在其中使用 YAML (pyYaml 3.11),特别是因为它“漂亮”并且用户可以在必要时轻松地在文本编辑器中进行编辑。不过,我的问题是,如果我将 YAML 引入 p
我是一名优秀的程序员,十分优秀!