开发者社区> dasein58> 正文

大多数程序员都不知道的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。如果您有兴趣了解其中一个的更多信息,请告诉我!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
18586 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
27734 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
21936 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
19982 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
15295 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14860 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
20879 0
+关注
918
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载