- 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/
我有一个 TOML 文档,其中某些键可能存在也可能不存在。例如。该文件是有效文件: foo = "bar" 但这也是有效的: foo = "bar" something = "else" 我现在正尝试
我正在使用 Dynaconf (3.1.2) 来处理我的 python 应用程序设置。 如果我在 settings.toml 和 .secrets.toml 中使用相同的 key ,则这些部分最后仅包
我正在使用 Dynaconf (3.1.2) 来处理我的 python 应用程序设置。 如果我在 settings.toml 和 .secrets.toml 中使用相同的 key ,则这些部分最后仅包
TOML said“TOML和YAML都强调人类的可读性,例如使人们更容易理解给定行目的的注释。TOML的不同之处在于将它们组合在一起,允许注释(与JSON不同),但保留了简单性(与YAML不同)。”
我正在尝试为 TOML 文档实现可链接的查询执行。 A Query是更改 TOML 文档并可能返回另一个 Query 的东西应在其自身之后执行的对象。 Query执行的获取前一个查询的结果(如果有的话
看着 toml repo ,我没有看到任何关于键命名约定的限制/建议 看起来大部分变量都是 lowercase但想知道 key 的最佳实践 - 命名约定是什么? 假设我想要一个名为 firstname
我想从 TOML 文件生成 JSON。 JSON 结构应该是这样的,在对象数组中包含对象数组: { "things": [ { "a": "thing1
背景 我正要尝试从GitHub下载的Python包,发现它没有setup.py ,所以我无法安装它 pip install -e 相反,该软件包具有 pyproject.toml 文件似乎具有与 s
获取以下 TOML 数据: [[items]] foo = 10 bar = 100 [[items]] foo = 12 bar = 144 还有下面的 rust 代码: use serde_der
“WSO IS 5.9.0”的新功能是 deployment.toml ,但我还没有找到配置选项,也没有找到如何从这个文件设置 xml 配置文件的方法。 例如,如果我想在 carbon.xml 中启用
“WSO IS 5.9.0”的新功能是 deployment.toml ,但我还没有找到配置选项,也没有找到如何从这个文件设置 xml 配置文件的方法。 例如,如果我想在 carbon.xml 中启用
从 toml 文件中读取的字符串值包含额外的引号: # Toml file string_key = "fdsafdsafdsfds" 代码: let cfg_file_content = g
我正在尝试读取 TOML 文件以创建一个结构,该结构包含具有关联值的枚举向量。这是示例代码: extern crate serde; #[macro_use] extern crate serde_d
我有共享公共(public)资源且无法同时执行的测试。这些测试因 cargo test 而失败,但适用于 RUST_TEST_THREADS=1 cargo test。 我可以修改测试以等待全局互斥锁
我使用以下方式安装了依赖项: go get github.com/BurntSushi/toml 我在与 main.go 相同的文件夹中创建了一个 toml 文件: . |-- cloud.toml
我有一个包含两个可执行文件的 Rust 项目: src └── bin ├── app.rs └── tool.rs tool 程序作为app 的子进程运行。 (需要进行分离,因为 t
背景 我目前正在编写一个绑定(bind) C 库的 crate ,我需要用户指定构建库的位置。以前,我见过 llvm-sys 的句柄crate 使用环境变量。但是,如果我经常使用它,每次我想运行一个项
所以我在 GitHub 存储库中有几个文件,我想设置一个自定义的 404 错误页面。当我搜索它时,它要求我在 netlify.toml 中插入一些东西。文件,它应该在我的根目录中(我认为这意味着存储库
Pip 支持 pyproject.toml文件,但到目前为止,新模式的所有实际使用都需要一个 3rd 方工具来自动生成这些文件(例如,诗歌和 pip)。不像 setup.py这已经是人类可写的,pyp
我希望有这样的东西:cargo install stopwatch 但在文档中找不到它。 查找包版本并手动将包添加到.toml: [dependencies] stopwatch="0.0.6" 感觉
我是一名优秀的程序员,十分优秀!