溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

大多數(shù)程序員都不知道的YAML功能有哪些

發(fā)布時(shí)間:2021-10-18 14:18:07 來源:億速云 閱讀:171 作者:iii 欄目:web開發(fā)

這篇文章主要介紹“大多數(shù)程序員都不知道的YAML功能有哪些”,在日常操作中,相信很多人在大多數(shù)程序員都不知道的YAML功能有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”大多數(shù)程序員都不知道的YAML功能有哪些”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

 

提升您的YAML知識(shí)以編寫更清晰的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ù)您的編程語言,您可能說“  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

等效符號(hào)

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種寫布爾值的方法。如果您想對(duì)字符串使用引號(hào),我也將像JSON一樣使用“。您仍然需要記住”  no“,但是至少該文件看起來對(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的情況下“工作”。

長字符串

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(為便于閱讀,添加了換行符;請(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."}

多行字符串

mail_signature: |       Martin Thoma       Tel. +49 123 4567

這等效于JSON:

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

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

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

這等效于以下JSON:

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

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

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

foo: &default_settings   db:     host: localhost     name: main_db     port: 1337   email:     admin: admin@example.com prod: *default_settings dev: *default_settings

這使:

{ "dev": { "db": {"host":                   "localhost",                   "name": "main_db",                   "port": 1337},            "email": {"admin": "admin@example.com"}},   "foo": { "db": {"host": "localhost",                   "name": "main_db",                   "port": 1337},            "email": {"admin": "admin@example.com"}},   "prod": { "db": {"host": "localhost",                    "name": "main_db",                    "port": 1337},             "email": {"admin": "admin@example.com"}}}

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

foo: &default_settings   db:     host: localhost     name: main_db     port: 1337   email:     admin: admin@example.com prod:   <<: *default_settings   app:     port: 80 dev: *default_settings

等效于以下JSON:

{ "foo": { "db": {"host": "localhost",                   "name": "main_db",                   "port": 1337},            "email": {"admin": "admin@example.com"}},   "prod": { "app": {"port": 80},             "db": {"host": "localhost",                    "name": "main_db",                    "port": 1337},             "email": {"admin": "admin@example.com"}},   "dev": { "db": {"host": "localhost",                   "name": "main_db",                   "port": 1337},            "email": {"admin": "admin@example.com"}},}

類型轉(zhuǎn)化

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

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

price: !!float 42 id: !!str 42

或更復(fù)雜的內(nèi)容,例如映射到直接在YAML中未指定的默認(rèn)Python類型:

tuple_example: !!python/tuple   - 1337   - 42 set_example: !!set {1337, 42} date_example: !!timestamp 2020-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)

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

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

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

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

請(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)分別表示文檔:

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

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

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

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

靜態(tài)站點(diǎn)生成器Pelican使用它來區(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。

到此,關(guān)于“大多數(shù)程序員都不知道的YAML功能有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI