成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

大多數程序員都不知道的6個YAML功能

開發 前端
YAML是一種常用于數據序列化的文件格式。有大量使用YAML文件進行配置的項目,例如Docker-compose,pre-commit,TravisCI,AWS Cloudformation,ESLint,Kubernetes,Ansible等。了解YAML的功能可以幫助您實現所有這些功能。

 [[384347]]

提升您的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。如果您有興趣了解其中一個的更多信息,請告訴我!

責任編輯:華軒 來源: 今日頭條
相關推薦

2019-10-11 10:03:02

負載均衡器LVS虛擬服務器

2022-03-23 20:49:13

微信移動應用

2023-02-27 15:44:17

Java開發技巧

2019-07-12 15:28:41

緩存數據庫瀏覽器

2023-01-17 16:25:18

前端開發JSON

2018-05-08 15:30:46

程序員代碼框架

2024-07-17 14:12:07

開源工具開發管理模板

2021-02-08 22:32:43

程序員 靜態網頁

2024-02-01 09:34:06

HTML前端新特性

2021-09-28 15:31:07

Windows 11操作系統微軟

2019-10-25 22:17:25

開發者技能工具

2018-09-20 17:05:01

前端程序員JavaScript

2021-02-23 07:10:54

Redis數據庫緩存

2019-10-09 10:21:20

負載均衡架構開發

2020-12-21 09:00:04

MySQL緩存SQL

2022-08-08 11:13:35

API接口前端

2011-08-23 13:50:17

程序員

2022-10-29 17:34:18

JVMJava

2020-12-21 09:44:53

MySQL查詢緩存數據庫

2009-07-14 15:39:34

Swing大多數控件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美国产精品一区二区三区 | 亚洲伊人久久综合 | 狠狠躁18三区二区一区 | 成人在线亚洲 | jdav视频在线观看免费 | 亚洲品质自拍视频网站 | 欧洲免费视频 | 成人精品鲁一区一区二区 | 91精品国产一二三 | 精品视频在线观看 | 一级午夜aaa免费看三区 | 亚洲精品乱码久久久久v最新版 | 麻豆av在线| 亚洲男女激情 | 国产成人一区二区 | 亚洲一区二区av在线 | 亚洲一区二区三区在线免费 | 久久精品亚洲国产奇米99 | a免费观看 | 成人在线精品视频 | 日韩午夜影院 | 亚洲精品一区二区另类图片 | 国产激情免费视频 | 在线国产视频 | 国产免费一区二区三区网站免费 | 国产免费又色又爽又黄在线观看 | 亚洲狠狠| 九七午夜剧场福利写真 | 欧美区日韩区 | 亚洲精品福利在线 | 你懂的在线视频播放 | 正在播放国产精品 | 伊人精品一区二区三区 | 黄网免费看| 亚洲欧美中文字幕 | 超碰在线人人干 | 国产精品18hdxxxⅹ在线 | 国产一级在线 | 9191av| 天天操天天插天天干 | 欧美一区二区综合 |