大多数程序员都不知道的6个YAML功能

简介:   提升您的YAML知识以编写更清晰的YAML文件大多数程序员都不知道的6个YAML功能  YAML是一种常用于数据序列化的文件格式。有大量使用YAML文件进行配置的项目,例如Docker-compose,pre-commit,TravisCI,AWS Cloudformation,ESLint,Kubernetes,Ansible等。了解YAML的功能可以帮助您实现所有这些功能。  让我们先介绍一下基础知识:YAML是JSON(源)的超集。每个有效的JSON文件也是一个有效的YAML文件。这意味着您拥有所有期望的类型:整数,浮点数,字符串,布尔值,空值。以及序列和图。根据您的编程语言

  提升您的YAML知识以编写更清晰的YAML文件大多数程序员都不知道的6个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

  Tel. +49 123 4567"}

  请注意如何忽略前导空格。第一行(“ Martin Thoma”)确定忽略的前导空白的数量。

  锚

  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

  prod: *default_settings

  dev: *default_settings

  这使:

  { "dev": { "db": {"host":

  "localhost",

  "name": "main_db",

  "port": 1337},

  "email": {"admin": "admin@example"}},

  "foo": { "db": {"host": "localhost",

  "name": "main_db",

  "port": 1337},

  "email": {"admin": "admin@example"}},

  "prod": { "db": {"host": "localhost",

  "name": "main_db",

  "port": 1337},

  "email": {"admin": "admin@example"}}}

  现在,您可能想在开发和生产设置中插入密码。您可以使用合并键<<来做到这一点:

  foo: &default_settings

  db:

  host: localhost

  name: main_db

  port: 1337

  email:

  admin: admin@example

  prod:

  <<: *default_settings

  app:

  port: 80

  dev: *default_settings

  等效于以下JSON:

  { "foo": { "db": {"host": "localhost",

  "name": "main_db",

  "port": 1337},

  "email": {"admin": "admin@example"}},

  "prod": { "app": {"port": 80},

  "db": {"host": "localhost",

  "name": "main_db",

  "port": 1337},

  "email": {"admin": "admin@example"}},

  "dev": { "db": {"host": "localhost",

  "name": "main_db",

  "port": 1337},

  "email": {"admin": "admin@example"}},}类型转化

  双重爆炸!在YAML中有特殊含义。它被称为“第二标签句柄”和!tag:yaml,2002 :(源)的简写。

  您可以像这样进行简单的转换:

  price: !!float 42

  id: !!str 42

  或更复杂的内容,例如映射到直接在YAML中未指定的默认Python类型:

  tuple_example: !!python/tuple

  - 1337

  - 42

  set_example: !!set {1337, 42}

  date_example: !!timestamp 2022-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(2022, 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。如果您有兴趣了解其中一个的更多信息,请告诉我!

目录
相关文章
|
6月前
|
机器学习/深度学习 数据可视化 计算机视觉
YOLOv5改进 | 2023Neck篇 | 轻量级跨尺度特征融合模块CCFM(附yaml文件+添加教程)
YOLOv5改进 | 2023Neck篇 | 轻量级跨尺度特征融合模块CCFM(附yaml文件+添加教程)
689 1
|
2月前
|
JSON Kubernetes API
深入理解Kubernetes配置:编写高效的YAML文件
深入理解Kubernetes配置:编写高效的YAML文件
|
5月前
|
存储 运维 Serverless
函数计算产品使用问题之在YAML文件中配置了环境变量,但在PHP代码中无法读取到这些环境变量,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
1月前
|
Kubernetes 应用服务中间件 nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
|
1月前
|
Kubernetes Docker Perl
k8s常见故障--yaml文件检查没有问题 pod起不来(一直处于创建中)
k8s常见故障--yaml文件检查没有问题 pod起不来(一直处于创建中)
|
1月前
ingress相关yaml文件报错且相关资源一切正常解决方法
ingress相关yaml文件报错且相关资源一切正常解决方法
ingress相关yaml文件报错且相关资源一切正常解决方法
|
4月前
|
运维 Kubernetes Serverless
Serverless 应用引擎使用问题之s.yaml文件中如何使用外部环境变量
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
4月前
|
存储 缓存 运维
函数计算产品使用问题之如何将外部环境变量放到s.yaml文件中使用
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
3月前
|
机器学习/深度学习 计算机视觉 Python
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
102 0
|
3月前
|
JSON Kubernetes 数据格式
k8s集群yaml文件方式迁移
k8s集群yaml文件方式迁移