- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
TOML said“TOML和YAML都强调人类的可读性,例如使人们更容易理解给定行目的的注释。TOML的不同之处在于将它们组合在一起,允许注释(与JSON不同),但保留了简单性(与YAML不同)。”
我可以看到TOML并不依赖空白,但是除此之外,我不确定它声称的简单。那到底是什么?
然后,我看到StrictYAML:“StrictYAML是一种类型安全的YAML解析器,用于解析和验证YAML规范的受限子集。” 类型安全的,这又是什么?
StrictYAML认为TOML不能为YAML解决的问题是什么?我确实阅读了StrictYAML网站上的文章,但仍不清楚。
因此,TOML和StrictYAML都希望解决YAML所存在的“问题”。但是,除了缩进,还有什么问题?
- - 更新 - -
我在reddit中发现StrictYaml的作者谈论了YAML vs TOML。但是到目前为止,我得到的答案是“strictyaml对YAML的理解很差”
YAML downsides:
Implicit typing causes surprise type changes. (e.g. put 3 where youpreviously had a string and it will magically turn into an int).
A bunch of nasty "hidden features" like node anchors and referencesthat make it look unclear (although to be fair a lot of people don'tuse this).
TOML downsides:
Noisier syntax (especially with multiline strings).
The way arrays/tables are done is confusing, especially arrays oftables.
I wrote a library that removed most of the nasty stuff I didn't likeabout YAML leaving the core which I liked. It's got a pretty detailedcomparison between it and a bunch of other config formats, e.g.: https://github.com/crdoconnor/strictyaml/blob/master/FAQ.rst#why-not-use-toml
最佳答案
这可能是一个自以为是的答案,因为我已经编写了多个YAML实现。
替代方案解决了对YAML的常见批评
YAML的突出语义特征是它可以表示可能的循环图。此外,YAML映射可以将复杂的节点(序列或映射)用作键。当您要表示任意数据结构时,可能需要这些功能。
YAML的另一个特殊功能是标签。他们的目标是用不同的编程语言抽象不同的类型,例如!!map
在Python中是dict
,而在JavaScript中是object
。尽管很少明确使用,但是隐式标签解析是为什么false
通常作为 bool 值加载而droggeljug
作为字符串加载的原因。这里的明显目标是通过不需要写 bool 值(如!!bool false
)或在每个字符串值上加引号来减少噪声。
但是,事实表明,很多人对此感到困惑,YAML定义可以解析yes
,因为 bool 值也无济于事。 YAML 1.2试图通过描述您可以使用的不同模式来对此进行补救,其中基本的“故障安全”模式专门加载到映射,序列和字符串,而更复杂的“JSON”和“核心”模式则进行其他类型的猜测。但是,大多数YAML实现(主要是PyYAML)在YAML 1.1上保留了很长时间(许多实现最初是重写的PyYAML代码,例如libyaml,SnakeYAML)。这巩固了YAML做出需要修正的可疑打字决定的观点。
如今,一些实现得到了改进,您可以使用故障保护模式来避免不必要的 bool 值。在这方面,StrictYAML仅限于故障安全模式。不要相信它的论点,这是PyYAML无法做到的。
YAML实现的一个常见安全问题是,它们将标记映射到任意构造函数调用(you can read up about an exploit in Ruby on Rails based on this here)。记住这不是YAML的缺点; YAML不建议在对象构造过程中的任何地方调用未知函数。这里的基本问题是,数据序列化是数据封装的大敌。如果您的编程语言提供了构造函数作为构造对象的唯一方法,那么这就是在反序列化数据时需要执行的操作。这里的补救措施仅是调用已知的构造函数,该构造函数是在一系列此类攻击(另一个使用SnakeYAML iirc的攻击)浮出水面之后广泛实现的。如今,要调用未知的构造函数,您需要在PyYAML中使用一个恰本地命名为DangerLoader
的类。
汤姆
TOML的主要语义差异是它不支持循环,复杂键或标记。这意味着,尽管可以在任意用户定义的类中加载YAML,但始终将TOML加载到包含数据的表或数组中。
例如,虽然YAML允许您将{foo: 1, bar: 2}
加载到具有foo
和bar
整数字段的类的对象中,但TOML始终将其加载到表中。您通常在文档中发现的YAML功能的一个突出示例是,它可以将标量1d6
加载到对象{number: 1, sides: 6}
中; TOML将始终将其加载为字符串"1d6"
。
TOML在这里的简单性在于它没有像YAML那样做某些事情。例如,如果您使用的是Java之类的静态类型语言,则在将{foo: 1, bar: 2}
加载到对象myObject
中之后,就可以安全地访问myObject.foo
(获取整数1
)。如果使用TOML,则需要执行myObject["foo"],
,如果键不存在,则可能引发异常。在像Python这样的脚本语言中,情况并非如此:在这里,如果myObject.foo
并非foo
的属性,则myObject.
会编译并因运行时错误而失败
我从这里回答许多YAML问题的观点是,人们不使用YAML的功能,而是经常将所有内容加载到Map<String, Object>
之类的结构中(以Java为例),然后从那里获取它。如果这样做,您也可以使用TOML。
TOML提供了一种不同的简单性语法:由于它比YAML简单得多,因此更容易发出用户可以理解的错误。例如,YAML语法错误中的常见错误文本是“在此上下文中不允许使用映射值”(尝试在SO上进行搜索以查找大量问题)。例如,您在这里获得此信息:
foo: 1
bar: 2
该错误信息不能帮助用户修复错误。这是由于YAML的语法复杂:YAML认为
1
和
bar
是多行标量的一部分(因为
bar:
比
foo:
缩进更多),将它们放在一起,然后看到第二个
:
并失败,因为多行标量可能不是用作隐式键。但是,最有可能的是,用户只是缩进了
bar:
或给他们留下了可以为foo(
1
)和一些 child 提供标量值的印象。由于YAML语法的可能性,很难编写出可以帮助用户的错误消息。
All data is a string, list or OrderedDict
list
和
OrderedDict
在Python中都不是可哈希的)。
关于python - TOML,YAML和StrictYAML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65283208/
我是一名优秀的程序员,十分优秀!