日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
大多數(shù)程序員都不知道的6個(gè)YAML功能

提升您的YAML知識(shí)以編寫更清晰的YAML文件

YAML是一種常用于數(shù)據(jù)序列化的文件格式。有大量使用YAML文件進(jìn)行配置的項(xiàng)目,例如Docker-compose,pre-commit,TravisCI,AWS Cloudformation,ESLint,Kubernetes,Ansible等。了解YAML的功能可以幫助您實(shí)現(xiàn)所有這些功能。

讓我們先介紹一下基礎(chǔ)知識(shí):YAML是JSON(源)的超集。每個(gè)有效的JSON文件也是一個(gè)有效的YAML文件。這意味著您擁有所有期望的類型:整數(shù),浮點(diǎn)數(shù),字符串,布爾值,空值。以及序列和圖。根據(jù)您的編程語(yǔ)言,您可能說(shuō)“ array”或“ list”而不是序列,而說(shuō)“ dictionary”而不是map。

通??雌饋?lái)像這樣:

 
 
 
 
  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

等效符號(hào)

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種寫布爾值的方法。如果您想對(duì)字符串使用引號(hào),我也將像JSON一樣使用“。您仍然需要記住” no“,但是至少該文件看起來(lái)對(duì)YAML初學(xué)者更熟悉。

正如湯姆·里奇福德(Tom Ritchford)所指出的,還有更多類似的危險(xiǎn)案例:

  • 013映射到11,因?yàn)榍皩?dǎo)零觸發(fā)八進(jìn)制表示法
  • 4:30映射到270。Max Werner Kaul-Gothe和Niklas Baumstark告訴我,這被自動(dòng)轉(zhuǎn)換為分鐘(或秒?),因?yàn)樗唤忉尀槌掷m(xù)時(shí)間:4 * 60 + 30 = 270。有趣的是,這種模式仍然可以在1:1:1:1:1:1:1:1:4:30的情況下“工作”。

長(zhǎng)字符串

 
 
 
 
  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(為便于閱讀,添加了換行符;請(qǐng)忽略它們):

{"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"}

請(qǐng)注意如何忽略前導(dǎo)空格。第一行(“ Martin Thoma”)確定忽略的前導(dǎo)空白的數(shù)量。

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

這等效于以下JSON:

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

&定義了一個(gè)變量emailAddress,其值為“ info@example.de。然后,*表示緊隨其后的是變量名。

您可以對(duì)映射執(zhí)行相同的操作:

 
 
 
 
  1. foo: &default_settings
  2.   db:
  3.     host: localhost
  4.     name: main_db
  5.     port: 1337
  6.   email:
  7.     admin: admin@cdxwcx.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@cdxwcx.com"}},
  6.   "foo": { "db": {"host": "localhost",
  7.                   "name": "main_db",
  8.                   "port": 1337},
  9.            "email": {"admin": "admin@cdxwcx.com"}},
  10.   "prod": { "db": {"host": "localhost",
  11.                    "name": "main_db",
  12.                    "port": 1337},
  13.             "email": {"admin": "admin@cdxwcx.com"}}}

現(xiàn)在,您可能想在開發(fā)和生產(chǎn)設(shè)置中插入密碼。您可以使用合并鍵<<來(lái)做到這一點(diǎn):

 
 
 
 
  1. foo: &default_settings
  2.   db:
  3.     host: localhost
  4.     name: main_db
  5.     port: 1337
  6.   email:
  7.     admin: admin@cdxwcx.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@cdxwcx.com"}},
  5.   "prod": { "app": {"port": 80},
  6.             "db": {"host": "localhost",
  7.                    "name": "main_db",
  8.                    "port": 1337},
  9.             "email": {"admin": "admin@cdxwcx.com"}},
  10.   "dev": { "db": {"host": "localhost",
  11.                   "name": "main_db",
  12.                   "port": 1337},
  13.            "email": {"admin": "admin@cdxwcx.com"}},}

類型轉(zhuǎn)化

雙重爆炸!在YAML中有特殊含義。它被稱為“第二標(biāo)簽句柄”和!tag:yaml.org,2002 :(源)的簡(jiǎn)寫。

您可以像這樣進(jìn)行簡(jiǎn)單的轉(zhuǎn)換:

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

或更復(fù)雜的內(nèi)容,例如映射到直接在YAML中未指定的默認(rèn)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)

你會(huì)得到這個(gè):

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

本示例使用特定于Python的標(biāo)記!! python / tuple和一些標(biāo)準(zhǔn)的YAML標(biāo)記。PyYaml有一個(gè)不錯(cuò)的概述:

 
 
 
 
  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(...)

請(qǐng)注意,加載非標(biāo)準(zhǔn)標(biāo)簽是不安全的!可以使用!! python / object / apply:module.f執(zhí)行任意代碼。在PyYaml中,您需要yaml.unsafe_load才能使用它。因此,您可能不應(yīng)該使用它!

一個(gè)YAML中的多個(gè)文檔

YAML中的三個(gè)破折號(hào)分別表示文檔:

 
 
 
 
  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

如果將已分析的內(nèi)容轉(zhuǎn)換為列表并打印出來(lái),則會(huì)得到:

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

請(qǐng)注意,這不是寫列表的替代符號(hào)。是不同的文件。

靜態(tài)站點(diǎn)生成器Pelican使用它來(lái)區(qū)分元數(shù)據(jù)和內(nèi)容。我還沒有看到其他任何使用此功能的應(yīng)用程序。編輯:Clemens Tolboom提醒我,靜態(tài)網(wǎng)站生成器Jekyl也使用它。Chairat Onyaem(Par)指出oc進(jìn)程也會(huì)生成此類YAML。謝謝你的評(píng)論!

下一步是什么?

有很多配置文件格式,例如TOML,INI,JSON,XML,dotenv,以及數(shù)據(jù)序列化格式,例如Pythons pickle,HDF5,Numpys NPZ,XML。如果您有興趣了解其中一個(gè)的更多信息,請(qǐng)告訴我!


新聞名稱:大多數(shù)程序員都不知道的6個(gè)YAML功能
文章出自:http://www.dlmjj.cn/article/dpjddgc.html