您现在的位置是:亿华云 > 系统运维
大多数程序员都不知道的6个YAML功能
亿华云2025-10-09 06:55:13【系统运维】6人已围观
简介提升您的YAML知识以编写更清晰的YAML文件YAML是一种常用于数据序列化的文件格式。有大量使用YAML文件进行配置的项目,例如Docker-compose,pre-commit,TravisCI,
提升您的大多都不YAML知识以编写更清晰的YAML文件

YAML是一种常用于数据序列化的文件格式。有大量使用YAML文件进行配置的数程项目,例如Docker-compose,知道pre-commit,大多都不TravisCI,数程AWS Cloudformation,知道ESLint,大多都不Kubernetes,数程Ansible等。知道了解YAML的大多都不功能可以帮助您实现所有这些功能。
让我们先介绍一下基础知识:YAML是数程JSON(源)的超集。每个有效的知道JSON文件也是一个有效的YAML文件。这意味着您拥有所有期望的大多都不类型:整数,浮点数,数程字符串,知道布尔值,空值。以及序列和图。根据您的编程语言,您可能说“ array”或“ list”而不是序列,源码库而说“ dictionary”而不是map。
通常看起来像这样:
mysql: host: localhost user: root password: something preprocessing_queue: # Line comments are available! - name: preprocessing.scale_and_center width: 32 height: 32 - preprocessing.dot_reduction use_anonymous: true等效符号
YAML有很多等效的编写方法:
list_by_dash: - foo - bar list_by_square_bracets: [foo, bar] map_by_indentation: foo: bar bar: baz map_by_curly_braces: { foo: bar, bar: baz} string_no_quotes: Monty Python string_double_quotes: "Monty Python" string_single_quotes: Monty Python bool_english: yes bool_english_no: no bool_python: True bool_json: true这里有些警告:
language: no # ISO 639-1 code for the Norwegian language此否被解释为false。您需要输入“ no”或“ no”。
通常,我建议像布尔值JSON一样使用true和false,但是YAML支持11种写布尔值的方法。如果您想对字符串使用引号,我也将像JSON一样使用“。您仍然需要记住” no“,但是至少该文件看起来对YAML初学者更熟悉。
正如汤姆·里奇福德(Tom Ritchford)所指出的,还有更多类似的危险案例:
013映射到11,因为前导零触发八进制表示法 4:30映射到270。Max Werner Kaul-Gothe和Niklas Baumstark告诉我,这被自动转换为分钟(或秒?),因为它被解释为持续时间:4 * 60 + 30 = 270。有趣的是,这种模式仍然可以在1:1:1:1:1:1:1:1:4:30的情况下“工作”。长字符串
disclaimer: > Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec urna pellentesque, imperdiet urna vitae, hendrerit odio. Donec porta aliquet laoreet. Sed viverra tempus fringilla.这等效于以下JSON(为便于阅读,添加了换行符;请忽略它们):
{ "disclaimer": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec urna pellentesque, imperdiet urna vitae, hendrerit odio. Donec porta aliquet laoreet. Sed viverra tempus fringilla."}
多行字符串
mail_signature: | Martin Thoma Tel. +49 123 4567这等效于JSON:
{ "mail_signature": "Martin Thoma\nTel. +49 123 4567"}
请注意如何忽略前导空格。第一行(“ Martin Thoma”)确定忽略的前导空白的数量。云南idc服务商
锚
email: &emailAddress "info@example.de" id: *emailAddress这等效于以下JSON:
{ "email": "info@example.de", "id": "info@example.de"}
&定义了一个变量emailAddress,其值为“ info@example.de。然后,*表示紧随其后的是变量名。
您可以对映射执行相同的操作:
foo: &default_settings db: host: localhost name: main_db port: 1337 email: admin: admin@example.com prod: *default_settings dev: *default_settings这使:
{ "dev": { "db": { "host": "localhost", "name": "main_db", "port": 1337}, "email": { "admin": "admin@example.com"}}, "foo": { "db": { "host": "localhost", "name": "main_db", "port": 1337}, "email": { "admin": "admin@example.com"}}, "prod": { "db": { "host": "localhost", "name": "main_db", "port": 1337}, "email": { "admin": "admin@example.com"}}}现在,您可能想在开发和生产设置中插入密码。您可以使用合并键<<来做到这一点:
foo: &default_settings db: host: localhost name: main_db port: 1337 email: admin: admin@example.com prod: <<: *default_settings app: port: 80 dev: *default_settings等效于以下JSON:
{ "foo": { "db": { "host": "localhost", "name": "main_db", "port": 1337}, "email": { "admin": "admin@example.com"}}, "prod": { "app": { "port": 80}, "db": { "host": "localhost", "name": "main_db", "port": 1337}, "email": { "admin": "admin@example.com"}}, "dev": { "db": { "host": "localhost", "name": "main_db", "port": 1337}, "email": { "admin": "admin@example.com"}},}类型转化
双重爆炸!在YAML中有特殊含义。它被称为“第二标签句柄”和!tag:yaml.org,2002 :(源)的简写。
您可以像这样进行简单的转换:
price: !!float 42 id: !!str 42或更复杂的内容,例如映射到直接在YAML中未指定的默认Python类型:
tuple_example: !!python/tuple - 1337 - 42 set_example: !!set { 1337, 42} date_example: !!timestamp 2020-12-31您可以这样阅读:
import yaml import pprint with open("example.yaml") as fp: data = fp.read() pp = pprint.PrettyPrinter(indent=4) pased = yaml.unsafe_load(data) pp.pprint(pased)你会得到这个:
{ date_example: datetime.date(2020, 12, 31), set_example: { 1337, 42}, tuple_example: (1337, 42)}本示例使用特定于Python的标记!! python / tuple和一些标准的YAML标记。PyYaml有一个不错的概述:
## Standard YAML tags YAML Python 3 !!null None !!bool bool !!int int !!float float !!binary bytes !!timestamp datetime.datetime !!omap, !!pairs list of pairs !!set set !!str str !!seq list !!map dict ## Python-specific tags YAML Python 3 !!python/none None !!python/bool bool !!python/bytes bytes !!python/str str !!python/unicode str !!python/int int !!python/long int !!python/float float !!python/complex complex !!python/list list !!python/tuple tuple !!python/dict dict ## Complex Python tags !!python/name:module.name module.name !!python/module:package.module package.module !!python/object:module.cls module.cls instance !!python/object/new:module.cls module.cls instance !!python/object/apply:module.f value of f(...)请注意,加载非标准标签是不安全的!可以使用!! python / object / apply:module.f执行任意代码。在PyYaml中,您需要yaml.unsafe_load才能使用它。因此,您可能不应该使用它!
一个YAML中的多个文档
YAML中的三个破折号分别表示文档:
foo: bar --- fizz: buzz在Python中,您可以使用PyYAML像这样加载它:
import yaml with open("example.yaml") as fp: data = fp.read() parsed = yaml.safe_load_all(data) # parsed is a generator如果将已分析的内容转换为列表并打印出来,源码下载则会得到:
[{ foo: bar}, { fizz: buzz}]请注意,这不是写列表的替代符号。是不同的文件。
静态站点生成器Pelican使用它来区分元数据和内容。我还没有看到其他任何使用此功能的应用程序。编辑:Clemens Tolboom提醒我,静态网站生成器Jekyl也使用它。Chairat Onyaem(Par)指出oc进程也会生成此类YAML。谢谢你的评论!
下一步是什么?
有很多配置文件格式,例如TOML,INI,JSON,XML,dotenv,以及数据序列化格式,例如Pythons pickle,HDF5,Numpys NPZ,XML。如果您有兴趣了解其中一个的更多信息,请告诉我!
很赞哦!(9872)