服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - 大多数程序员都不知道的6个YAML功能

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

2021-03-01 22:53今日头条闻数起舞 编程技术

YAML是一种常用于数据序列化的文件格式。有大量使用YAML文件进行配置的项目,例如Docker-compose,pre-commit,TravisCI,AWS Cloudformation,ESLint,Kubernetes,Ansible等。了解YAML的功能可以帮助您实现所有这些功能。

 大多数程序员都不知道的6个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。

通常看起来像这样:

  1. mysql: 
  2.   host: localhost 
  3.   user: root 
  4.   password: something 
  5. preprocessing_queue:  # Line comments are available! 
  6.   - name: preprocessing.scale_and_center 
  7.     width: 32 
  8.     height: 32 
  9.   - preprocessing.dot_reduction 
  10. use_anonymous: true 

等效符号

YAML有很多等效的编写方法:

  1. list_by_dash: 
  2.   - foo 
  3.   - bar 
  4. list_by_square_bracets: [foo, bar] 
  5. map_by_indentation: 
  6.   foo: bar 
  7.   bar: baz 
  8. map_by_curly_braces: {foo: bar, bar: baz} 
  9. string_no_quotes: Monty Python 
  10. string_double_quotes: "Monty Python" 
  11. string_single_quotes: 'Monty Python' 
  12. bool_english: yes 
  13. bool_english_no: no 
  14. bool_python: True 
  15. bool_json: true 

这里有些警告:

  1. 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的情况下“工作”。

长字符串

  1. disclaimer: > 
  2.     Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
  3.     In nec urna pellentesque, imperdiet urna vitae, hendrerit 
  4.     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."}

多行字符串

  1. mail_signature: | 
  2.       Martin Thoma 
  3.       Tel. +49 123 4567 

这等效于JSON:

{"mail_signature": "Martin Thoma\nTel. +49 123 4567"}

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

  1. email: &emailAddress "info@example.de" 
  2. id: *emailAddress 

这等效于以下JSON:

{"email": "info@example.de", "id": "info@example.de"}

&定义了一个变量emailAddress,其值为“ info@example.de。然后,*表示紧随其后的是变量名。

您可以对映射执行相同的操作:

  1. foo: &default_settings 
  2.   db: 
  3.     host: localhost 
  4.     name: main_db 
  5.     port: 1337 
  6.   email: 
  7.     admin: admin@example.com 
  8. prod: *default_settings 
  9. dev: *default_settings 

这使:

  1. "dev": { "db": {"host"
  2.                   "localhost"
  3.                   "name""main_db"
  4.                   "port": 1337}, 
  5.            "email": {"admin""admin@example.com"}}, 
  6.   "foo": { "db": {"host""localhost"
  7.                   "name""main_db"
  8.                   "port": 1337}, 
  9.            "email": {"admin""admin@example.com"}}, 
  10.   "prod": { "db": {"host""localhost"
  11.                    "name""main_db"
  12.                    "port": 1337}, 
  13.             "email": {"admin""admin@example.com"}}} 

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

  1. foo: &default_settings 
  2.   db: 
  3.     host: localhost 
  4.     name: main_db 
  5.     port: 1337 
  6.   email: 
  7.     admin: admin@example.com 
  8. prod: 
  9.   <<: *default_settings 
  10.   app: 
  11.     port: 80 
  12. dev: *default_settings 

等效于以下JSON:

  1. "foo": { "db": {"host""localhost"
  2.                   "name""main_db"
  3.                   "port": 1337}, 
  4.            "email": {"admin""admin@example.com"}}, 
  5.   "prod": { "app": {"port": 80}, 
  6.             "db": {"host""localhost"
  7.                    "name""main_db"
  8.                    "port": 1337}, 
  9.             "email": {"admin""admin@example.com"}}, 
  10.   "dev": { "db": {"host""localhost"
  11.                   "name""main_db"
  12.                   "port": 1337}, 
  13.            "email": {"admin""admin@example.com"}},} 

类型转化

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

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

  1. price: !!float 42 
  2. id: !!str 42 

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

  1. tuple_example: !!python/tuple 
  2.   - 1337 
  3.   - 42 
  4. set_example: !!set {1337, 42} 
  5. date_example: !!timestamp 2020-12-31 

您可以这样阅读:

  1. import yaml 
  2. import pprint 
  3. with open("example.yaml"as fp: 
  4.     data = fp.read() 
  5. pp = pprint.PrettyPrinter(indent=4) 
  6. pased = yaml.unsafe_load(data) 
  7. pp.pprint(pased) 

你会得到这个:

  1. {   'date_example': datetime.date(2020, 12, 31), 
  2.     'set_example': {1337, 42}, 
  3.     'tuple_example': (1337, 42)} 

本示例使用特定于Python的标记!! python / tuple和一些标准的YAML标记。PyYaml有一个不错的概述:

  1. ## Standard YAML tags 
  2. YAML               Python 3 
  3. !!null             None 
  4. !!bool             bool 
  5. !!int              int 
  6. !!float            float 
  7. !!binary           bytes 
  8. !!timestamp        datetime.datetime 
  9. !!omap, !!pairs    list of pairs 
  10. !!set              set 
  11. !!str              str 
  12. !!seq              list 
  13. !!map              dict 
  14. ## Python-specific tags 
  15. YAML               Python 3 
  16. !!python/none      None 
  17. !!python/bool      bool 
  18. !!python/bytes     bytes 
  19. !!python/str       str 
  20. !!python/unicode   str 
  21. !!python/int       int 
  22. !!python/long      int 
  23. !!python/float     float 
  24. !!python/complex   complex 
  25. !!python/list      list 
  26. !!python/tuple     tuple 
  27. !!python/dict      dict 
  28. ## Complex Python tags 
  29. !!python/name:module.name         module.name 
  30. !!python/module:package.module    package.module 
  31. !!python/object:module.cls        module.cls instance 
  32. !!python/object/new:module.cls    module.cls instance 
  33. !!python/object/apply:module.f    value of f(...) 

请注意,加载非标准标签是不安全的!可以使用!! python / object / apply:module.f执行任意代码。在PyYaml中,您需要yaml.unsafe_load才能使用它。因此,您可能不应该使用它!

一个YAML中的多个文档

YAML中的三个破折号分别表示文档:

  1. foo: bar 
  2. --- 
  3. fizz: buzz 

在Python中,您可以使用PyYAML像这样加载它:

  1. import yaml 
  2. with open("example.yaml"as fp: 
  3.     data = fp.read() 
  4. parsed = yaml.safe_load_all(data)  # parsed is a generator 

如果将已分析的内容转换为列表并打印出来,则会得到:

  1. [{'foo''bar'}, {'fizz''buzz'}] 

请注意,这不是写列表的替代符号。是不同的文件。

静态站点生成器Pelican使用它来区分元数据和内容。我还没有看到其他任何使用此功能的应用程序。编辑:Clemens Tolboom提醒我,静态网站生成器Jekyl也使用它。Chairat Onyaem(Par)指出oc进程也会生成此类YAML。谢谢你的评论!

下一步是什么?

有很多配置文件格式,例如TOML,INI,JSON,XML,dotenv,以及数据序列化格式,例如Pythons pickle,HDF5,Numpys NPZ,XML。如果您有兴趣了解其中一个的更多信息,请告诉我!

原文地址:https://www.toutiao.com/i6934590069487518212/

延伸 · 阅读

精彩推荐
  • 编程技术让开发效率倍增的 VS Code 插件

    让开发效率倍增的 VS Code 插件

    今天来分享一些提升开发效率的实用 VS Code 插件!Better Comments 扩展可以帮助我们在代码中创建更人性化的注释,有不同形式和颜色的注释供我们选择。 ...

    前端充电宝7132022-04-21
  • 编程技术2021年值得关注的React PDF 库

    2021年值得关注的React PDF 库

    今天,许多网络应用程序为其用户提供内置的PDF浏览选项。然而,选择一个并不容易,因为它们的功能远远超过显示PDF。在这篇文章中,我将评估5个React的...

    TianTianUp5232021-06-21
  • 编程技术从Context源码实现谈React性能优化

    从Context源码实现谈React性能优化

    这篇文章主要介绍Context的实现原理,源码层面掌握React组件的render时机,从而写出高性能的React组件,源码层面了解shouldComponentUpdate、React.memo、PureComponen...

    魔术师卡颂5312020-12-20
  • 编程技术Delphi - Indy idMessage和idSMTP实现邮件的发送

    Delphi - Indy idMessage和idSMTP实现邮件的发送

    这篇文章主要介绍了Delphi - Indy idMessage和idSMTP实现邮件的发送,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    JJ_JeremyWu6592020-09-22
  • 编程技术用户态 Tcpdump 如何实现抓到内核网络包的?

    用户态 Tcpdump 如何实现抓到内核网络包的?

    在网络包的发送和接收过程中,绝大部分的工作都是在内核态完成的。那么问题来了,我们常用的运行在用户态的程序 tcpdump 是那如何实现抓到内核态的包...

    开发内功修炼11612021-09-08
  • 编程技术简单、好懂的Svelte实现原理

    简单、好懂的Svelte实现原理

    本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一边看、一边敲、一边学...

    魔术师卡颂4822021-11-10
  • 编程技术真正聪明的程序员,总有办法不加班

    真正聪明的程序员,总有办法不加班

    工作效率提升了,就可以少加班了,聪明的程序员,总会有一堆可以提升编码效率的工具?当一种工具满足不了工作需求,就去探索新的,今天纬小创就给...

    今日头条12482021-03-04
  • 编程技术AIOps,SRE工程师手中的利器

    AIOps,SRE工程师手中的利器

    AIOps开始成为一种极为重要的站点可靠性工程工具。它能够高效吸纳观察数据、参与数据以及来自第三方工具的数据,判断系统运行状态并保证其处于最佳...

    至顶网5972021-03-08