11 июня 2021

🐍 ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠ°ΠΊ инструмСнт управлСния прилоТСниями Π½Π° Python

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ-матСматичСского обСспСчСния ΠΈ спСциалист ΠΏΠΎ числСнному Π°Π½Π°Π»ΠΈΠ·Ρƒ прочности ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΈ Π½Π΅Ρ„Ρ‚Π΅Π³Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ°ΡˆΠΈΠ½ΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΡ; ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ с ΠΎΠΏΠΎΡ€ΠΎΠΉ Π½Π° числСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅; ΠΊ.Ρ‚.Π½. ΠΏΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ "Π”ΠΈΠ½Π°ΠΌΠΈΠΊΠ° ΠΈ ΠΏΡ€ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ машин, ΠΏΡ€ΠΈΠ±ΠΎΡ€ΠΎΠ² ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚ΡƒΡ€Ρ‹"
Π’ руководствС рассматриваСтся ΠΎΠ±Ρ‰ΠΈΠΉ шаблон ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ управлСния Python-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ с использованиСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ€ΠΎΠ»ΠΈ тСкстовых интСрфСйсов.
🐍 ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠ°ΠΊ инструмСнт управлСния прилоТСниями Π½Π° Python

Π’Π²ΠΎΠ΄Π½Ρ‹Π΅ замСчания ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…, Ρ‚ΠΎ Π½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ приходят статичныС тСкстовыС Ρ„Π°ΠΉΠ»Ρ‹, содСрТащиС описаниС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… настроСк систСмы ΠΈ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π² Ρ€ΠΎΠ»ΠΈ ΠΌΠ°Π»ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта инфраструктуры ΠΊΠΎΠ΄Π°. Π’Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° Ρ„Π°ΠΉΠ»Ρ‹ нСслоТно ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π² динамичСский элСмСнт инфраструктуры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния Π±Π΅Π· нСобходимости Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄.

К Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнным Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находят ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² контСкстС управлСния прилоТСниями Π½Π° Python, ΠΌΠΎΠΆΠ½ΠΎ отнСсти INI, JSON, TOML ΠΈ YAML.
  • INI – самый простой Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈΠ· рассмотрСнных. Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΡ‰Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Ρ‚Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅, Π½ΠΎ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ – Ρ„Π°ΠΉΠ»Ρ‹ *.INI ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ структурами, Ρ‚.Π΅. структурами с простой ΠΎΠ΄Π½ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠ΅ΠΉ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΠ³Π΄Π° приходится ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с модСлями ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΡ… прСдставлСниС Π² Π²ΠΈΠ΄Π΅ списков, ассоциативных массивов ΠΈ Ρ‚.ΠΏ., возмоТностСй INI оказываСтся нСдостаточно.
  • JSON-Ρ„Π°ΠΉΠ» выглядит ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Python ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ слоТныС иСрархичСскиС зависимости, ΠΎΠ΄Π½Π°ΠΊΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния читаСмости ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚ ΠΈ YAML, ΠΈ TOML. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, JSON Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Π° ΠΎΠ½ΠΈ часто ΠΌΠΎΠ³ΡƒΡ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ сопровоТдСниС ΠΊΠΎΠ΄Π°.
  • Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ…, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ TOML ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ нСсоизмСримой Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ ΠΈ ΡˆΠΈΡ€ΠΎΡ‚ΠΎΠΉ арсСнала ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. TOML ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ простыС ΠΏΠ°Ρ€Ρ‹ Β«ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β», массивы, классичСскиС ΠΈ встроСнныС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, массивы Ρ‚Π°Π±Π»ΠΈΡ†, Π±ΡƒΠ»Π΅Π²Ρ‹ значСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ со смСщСниСм.

Для сравнСния рассмотрим ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ модСль ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, описанного с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ TOML ΠΈ JSON.

Π’ΠΎΡ‚ TOML-прСдставлСниС ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

view_obj.toml
        [[fruits]]
name = "apple"

[fruits.physical]  # ΠΏΠΎΠ΄Ρ‚Π°Π±Π»ΠΈΡ†Π°
color = "red"
shape = "round"

[[fruits.varieties]]  # Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ массив Ρ‚Π°Π±Π»ΠΈΡ†
name = "red delicious"

[[fruits.varieties]]
name = "granny smith"

[[fruits]]
name = "banana"

[[fruits.varieties]]
name = "plantain"
    

А Π²ΠΎΡ‚ JSON-прСдставлСниС:

view_obj.json
        {
  "fruits": [
    {
      "name": "apple",
      "physical": {
        "color": "red",
        "shape": "round"
      },
      "varieties": [
        { "name": "red delicious" },
        { "name": "granny smith" }
      ]
    },
    {
      "name": "banana",
      "varieties": [
        { "name": "plantain" }
      ]
    }
  ]
}
    

БинтаксичСскиС особСнности JSON – ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ скобки – Π΄Π΅Π»Π°ΡŽΡ‚ слоТноструктурныС JSON-Ρ„Π°ΠΉΠ»Ρ‹ Β«Ρ€Π°Π·ΠΌΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈΒ».

Π€ΠΎΡ€ΠΌΠ°Ρ‚ YAML ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ схоТими с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ TOML возмоТностями (Π² смыслС гибкости прСдставлСния ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ разнообразия ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…), Π½ΠΎ Π½Π° слоТных структурах выглядит ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Π΅Π΅.

Вопрос Π²Ρ‹Π±ΠΎΡ€Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° зависит большС ΠΎΡ‚ слоТности описания ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½ΠΎ, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв для Π·Π°Π΄Π°Ρ‡, связанных с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Python-прилоТСниями, Π²Ρ‹Π±ΠΎΡ€ ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π° YAML.

Python-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ

Из всСго многообразия ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ – ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈΠ»ΠΈ «всСядных» – ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

  • configparser: это элСмСнт стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Python, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с INI-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Microsoft Windows. Π’ распоряТСнии ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΅ΡΡ‚ΡŒ класс ConfigParser, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ возмоТности Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.
  • PyYAML: элСмСнт Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, поэтому Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² pip pip install pyyaml. Π’ Python-сцСнарии ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ выглядит ΠΊΠ°ΠΊ import yaml.
  • toml: этот элСмСнт Ρ‚ΠΎΠΆΠ΅ прСдставляСт собой стороннСС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ TOML ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ установки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pip install toml.
  • dynaconf: это ΠΎΡ‡Π΅Π½ΡŒ гибкая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая 1) позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со всСми популярными Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (*.toml, *.yaml, *.json, *.ini, *.py), 2) ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ, Ρ‚.Π΅. ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ нСсколько Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², относящихся ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ стадиям готовности ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, default, development, production ΠΈ Ρ‚.Π΄.), Π° Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ настроСк Π·Π°Ρ‚Π΅ΠΌ вызываСтся с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, 3) ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ окруТСния (Β«Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ» с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ dotenv), 4) ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки для выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния (init, list, write, validate ΠΈ Ρ‚.Π΄.). УстанавливаСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² pip pip install dynaconf.
  • hydra: это, строго говоря, Π½Π΅ просто Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Π° полноцСнная ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°, прСдназначСнная для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π° Π·Π°Π΄Π°Ρ‡, связанных с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ слоТных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ hydra ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² pip pip install hydra-core --upgrade, Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² conda conda install -c conda-forge hydra-core.

Π’ основном, Π²Ρ‹Π±ΠΎΡ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ опрСдСляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ аспСктами:

  • ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π΅Π΅ особСнностями. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, конфигурация ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ машинного обучСния для развСртывания Π½Π° ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PyYAML/toml, Π° Π²ΠΎΡ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ слоТным web-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ скорСС всСго ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Ρ… возмоТностСй dynaconf ΠΈΠ»ΠΈ hydra;
  • трСбованиями ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π°. Π‘ этой Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния прСимущСства Π½Π° сторонС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ hydra;
  • Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ простотой сопровоТдСния ΠΊΠΎΠ΄Π°. Π—Π΄Π΅ΡΡŒ Ρ‡Π°Ρ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ PyYAML ΠΈ toml.
ΠžΠ±ΠΎΠ±Ρ‰Π°Ρ сказанноС Π²Ρ‹ΡˆΠ΅ ΠΈ учитывая класс Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ·Π²Π°Π½Ρ‹ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² контСкстС управлСния Python-прилоТСниями, Π΄Π°Π»Π΅Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ YAML-Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ PyYAML.

НСсколько слов ΠΎ синтаксисС YAML

Бинтаксис YAML прост ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π΅Π½, Π½ΠΎ Π΅ΡΡ‚ΡŒ нСсколько особСнностСй. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ YAML-Ρ„Π°ΠΉΠ» строится Π½Π° Π±Π°Π·Π΅ списка. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт списка это список ΠΏΠ°Ρ€ Β«ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ словарСм. Π’ΠΎ Π΅ΡΡ‚ΡŒ прСдставлСниС ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ YAML сводится ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ эту модСль Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… списков ΠΈ словарСй.

Иногда YAML-Ρ„Π°ΠΉΠ»Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с Ρ‚Ρ€ΠΎΠΉΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΡ€Π΅ --- ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ ..., Π° ΠΈΠ½ΠΎΠ³Π΄Π° эти ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„Π°ΠΉΠ»Π° ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚. PyYAML ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΎΠ±ΠΎΠΈΡ… случаях.

ВсС элСмСнты списка Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с - (Ρ‚ΠΈΡ€Π΅ ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»):

start_end.yaml
        --- # Начало Ρ„Π°ΠΉΠ»Π°
# Бписок Ρ„Ρ€ΡƒΠΊΡ‚ΠΎΠ²
- Apple
- Orange
- Strawberry
- Mango
... # ΠšΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°
    

Π‘Π»ΠΎΠ²Π°Ρ€ΠΈ YAML ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой, ΠΊΠ°ΠΊ Π² ΠΈ Python, Π½Π°Π±ΠΎΡ€Ρ‹ ΠΏΠ°Ρ€ Β«ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅Β» (Π·Π° Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π»):

dict.yaml
        # Π—Π°ΠΏΠΈΡΡŒ ΠΎ сотрудникС
martin:
  name: Martin Johnson
  job: Developer
  skill: Elite
    

YAML ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ стандартныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…: цСлочислСнный (int), вСщСствСнный (float), Π±ΡƒΠ»Π΅Π² (boolean), строковый (string) ΠΈ null:

types.yaml
        integer: 25
float: 25.0
exponent: 12.3015e+05
boolean: Yes
string: "25"
infinity: .inf # Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ
neginf: -.inf  # минус Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ
    

ΠŸΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… значСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструкции !![Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…], Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  • pi: !!float 3.14159,
  • flag: !!bool false ΠΈ Ρ‚.Π΄.

Π‘ΡƒΠ»Π΅Π²Ρ‹ значСния, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ записи, Π½ΠΎ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ true ΠΈ false, Ρ‡Ρ‚ΠΎΠ±Ρ‹ YAML-Ρ„Π°ΠΉΠ» Π±Ρ‹Π» совмСстим с настройками ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° YAML-Π»ΠΈΠ½Ρ‚Π΅Ρ€ΠΎΠ²:

supported_bools.yaml
        create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false
    

Π’ YAML Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ строковыС константы Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, Π½ΠΎ Π² ситуациях, ΠΊΠΎΠ³Π΄Π° трСбуСтся явно ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρƒ значСния, ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡˆΠ°ΡŽΡ‚. ДопускаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΈ Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ΄Ρ‹ строковых констант – ΠΈΡ… Π΅Ρ‰Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ экранированными ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ – \t (символ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ табуляции), \r (символ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊΠ°Ρ€Π΅Ρ‚ΠΊΠΈ), \n (символ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° Π½ΠΎΠ²ΡƒΡŽ строку) ΠΈ Ρ‚.Π΄.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ строками ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ символы | ΠΈ >

multilines_and_one_long_line.yaml
        include_newlines: |
            это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ
            Ρ‚Ρ€ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅
            строки
fold_newlines: >
            Π° это Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ΄Π½Π°
            длинная строка, которая
            выглядит ΠΊΠ°ΠΊ Ρ‚Ρ€ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅
    

Π‘Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ YAML-Ρ„Π°ΠΉΠ»Π° трСбуСтся ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ нСсколько Ρ€Π°Π·. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° Π·Π°Π΄Π°Ρ‡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ якоря & ΠΈ псСвдонимы *. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

anchor_alias.yaml
        hello: &hi 'hello' # вводится ΡΠΊΠΎΡ€ΡŒ hi
greeting:
  audience: 'world'
  hello: *hi # ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ якоря; hello ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ строку 'hello'
    

ΠŸΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ для Π±Π»ΠΎΠΊΠΎΠ²:

anchor_for_block.yaml
        foo:
  bar: &bar # псСвдоним для блока
    qux: 'quxqux'
    baz: 'bazbaz'
greeting:
  audience: 'world'
  bar: *bar # *bar развСрнСтся Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ qux ΠΈ baz
    

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π° слияния <<: ΠΌΠΎΠΆΠ½ΠΎ Β«Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΒ» ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Ρ‹:

merge_key.yaml
        bar: &bar # вводится псСвдоним Π±Π»ΠΎΠΊΠ°
  qux: 'quxqux'
  baz: 'bazbaz'
greeting:
  audience: 'world'
  bar:
    <<: *bar # *bar развСрнСтся Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ qux ΠΈ baz
    baz: 'notbaz' # НО baz ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π½ΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ notbaz
    

Для рСдактирования YAML-Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ любой тСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, Π½ΠΎ Π²Π°ΠΆΠ΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. НС всСгда Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ соврСмСнный Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ с красивым графичСским интСрфСйсом ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π° Π²ΠΎΡ‚ тСкстовый Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Vim прСдустановлСн Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ UNIX-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм.

ΠŸΠΎΡ€ΠΎΠ³ Π²Ρ…ΠΎΠ΄Π° высок, Π½ΠΎ Π·Π° счСт ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ количСства ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ увСличиваСтся ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ. Π”Π΅Ρ‚Π°Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ· книгиНСйла, Π”Ρ€ΡŽ Β«ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ использованиС VimΒ».

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°

Π’ простых сцСнариях использования, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π±ΡƒΠ΄Π΅Ρ‚ достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ явноС ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ !![Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…].

Π’ случаС слоТной структуры ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π² случаС сцСнария, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ самим Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ, Π½ΠΎ ΠΈ со сторонними ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния устойчивости ΠΈΠΌΠ΅Π΅Ρ‚ смысл пСрСнСсти ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ² Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π»ΠΎΠ³ΠΈΠΊΠΈ прилоТСния.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Python dataclasses ΠΈ стороннСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ marshmallow_dataclass.

Рассмотрим простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования marshmallow_dataclass, заимствованный со страницы ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

simple_example_marshmallow.py
        from dataclasses import dataclass, field
from typing import List, Optional

import marshmallow_dataclass
import marshmallow.validate


@dataclass
class Building:
    height: float = field(
       metadata = {
           "validate": marshmallow.validate.Range(min=0)
        }
    )
    name: str = field(default="anonymous")


@dataclass
class City:
    name: Optional[str]
    buildings: List[Building] = field(default_factory=list)



# создаСм экзСмпляр схСмы
city_schema = marshmallow_dataclass.class_schema(City)()
# city_schema => <City(many=False)>
# Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ
city = city_schema.load(
    {
        "name": "Paris",
        "buildings": [{
            "name": "Eiffel Tower",
            "height": 324
        }]
    }
)
# city => City(
        name='Paris',
        buildings=[
            Building(
                height=324.0,
                name='Eiffel Tower'
            )
        ]
     )

city.buildings
# => [Building(height=324.0, name='Eiffel Tower')]
city.buildings[0].height # 324.0
    

Π—Π΄Π΅ΡΡŒ класс Building содСрТит всСго Π΄Π²Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°: вСщСствСнный height ΠΈ строковый name. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° marshmallow.validate выполняСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° минимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° height, Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ field Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ name ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Класс City содСрТит ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ name, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ строкового Ρ‚ΠΈΠΏΠ°, Π»ΠΈΠ±ΠΎ None. Атрибут buildings ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° Building.

Π”Π°Π»Π΅Π΅ создаСм экзСмпляр схСмы city_schema Π½Π° Π±Π°Π·Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса City, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ. Π‘Ρ…Π΅ΠΌΠ° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ строку для Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° name ΠΈ список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Building, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ строковым Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ name ΠΈ вСщСствСнными Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ height.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΡƒΡŽ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΈ Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ списков ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

Π¨Π°Π±Π»ΠΎΠ½ примСнСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠ°ΠΊ инструмСнта управлСния Python-прилоТСниями

Π Π°Π·ΠΎΠ±Ρ€Π°Π²ΡˆΠΈΡΡŒ с основными понятиями ΠΈ концСпциями, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ связки Β«ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» + Python-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β».

Π’ самом простом случаС связка состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ модуля Python. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС для управлСния Python-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ²), Π° базовая Π»ΠΎΠ³ΠΈΠΊΠ° прилоТСния опираСтся Π½Π° Π½Π°Π±ΠΎΡ€ΠΎΠ² ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

Бильная сторона Ρ‚Π°ΠΊΠΎΠ³ΠΎ прСдставлСния Π·Π°Π΄Π°Ρ‡ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² возмоТности явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°:

  • ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉΡΡ Π±Π»ΠΎΠΊ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ инфраструктуры ΠΊΠΎΠ΄Π°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ,
  • Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉΡΡ Π±Π»ΠΎΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ – ΡΡ‚Π°Ρ‚ΠΈΡ‡Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, которая Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ.
<i>ВысокоуровнСвая схСма взаимодСйствия ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° с Python-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ</i>
ВысокоуровнСвая схСма взаимодСйствия ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° с Python-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ

Π£ΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎ, шаблон использования ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠ°ΠΊ тСкстового интСрфСйса ΠΊ Python-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ выглядит Ρ‚Π°ΠΊ: ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ выносятся Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π° базовая Π»ΠΎΠ³ΠΈΠΊΠ° описываСтся Π² Python-ΠΌΠΎΠ΄ΡƒΠ»Π΅.

Π­Ρ‚ΠΎΡ‚ шаблон распространяСтся Π½Π° прилоТСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ слоТности, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ СстСствСнныС ограничСния.

Если ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» разрастаСтся Π΄ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… быстрый поиск Π½ΡƒΠΆΠ½Ρ‹Ρ… ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈΠ»ΠΈ затрудняСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ слоТной Π»ΠΎΠ³ΠΈΠΊΠΈ управлСния, Ρ‚ΠΎ стоит Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ ΠΎ Π±ΠΎΠ»Π΅Π΅ эффСктивных ΠΏΡ€ΠΈΠ΅ΠΌΠ°Ρ… ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Π’ этом вопросС ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ:

  • DearPyGui: Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с графичСским интСрфСйсом ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ;
  • Streamlit: мощная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для прототипирования Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ с графичСским интСрфСйсом.
Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ рассмотрСнный шаблон Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ всСх Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ-настоящСму слоТных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с микросСрвисной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ), Π½ΠΎ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ способСн Β«Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒΒ» ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ подмноТСство этих Π·Π°Π΄Π°Ρ‡ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ взятого микросСрвиса.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ связки Β«ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ YAML-Ρ„Π°ΠΉΠ» + Python-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β»

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° возьмСм Π·Π°Π΄Π°Ρ‡Ρƒ обнаруТСния выбросов Π² дискрСтной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ стационарного гауссовского случайного процСсса с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ коррСляционных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ограничимся рассмотрСниСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ²: ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ, ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ-косинусного, ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ-косинусно-синусного (с плюсом) ΠΈ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ-косинусно-синусного (с минусом).

Для простоты Π³ΠΈΠΏΠΎΡ‚Π΅Π·Π° ΠΎ выбросах провСряСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ классичСской стандартизованной Z-ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ робастной Z-ΠΎΡ†Π΅Π½ΠΊΠΈ (Π°Π½Π³Π».) Π½Π° ΠΌΠ΅Π΄ΠΈΠ°Π½Π΅. Для модСлирования псСвдослучайных процСссов с гауссовским распрСдСлСниСм ΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΈ коррСляционными функциями Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° использовались Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, заимствованныС ΠΈΠ· ΠΊΠ½ΠΈΠ³ΠΈ Π‘Ρ‹ΠΊΠΎΠ²Π°, Π’.Π’. Β«Π¦ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² статистичСской Ρ€Π°Π΄ΠΈΠΎΡ‚Π΅Ρ…Π½ΠΈΠΊΠ΅Β».

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с пояснСниями ΠΈ дСталями Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ доступСн Π² github-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

Π’ΠΎΡ‚ Π΅Π³ΠΎ структура:

struct_repo.md
        .
configs/
  `- gauss_processes_acf.yaml
figure_exapmples/
  `- gauss_exp_acf.pdf
  `- ...
figures/
  `- *.pdf
python_scripts
  `- main.py
  `- helper_funcs_and_class_schema.py
README.md

    

Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ configs располагаСтся шаблон ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ своих собствСнных Π±ΠΎΠ»Π΅Π΅ слоТных ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ прилоТСния.

gauss_proc_acf.yaml
        ---
# *** MENU ***
# Types of ACF (for `kind_acf`):
# 1: exp type,
# 2: exp-cos type,
# 3: exp-cos-sin type (plus),
# 4: exp-cos-sin type (minus)

# *** MAIN CONTROL PARAMETERS ***
sigma: !!float 2            # standard deviation
w_star: !!float 1.25        # model parameter
w0: !!float 2.5             # model parameter
alpha: !!float 0.05         # smoothing factor for EWMA
window_width: !!int 14     # width of window in MA
delta_t: !!float 0.05       # time step
N: !!int 1000               # number of counts
kind_acf: !!int 1           # ACF type


# *** OTHERS APP SETTINGS ***
visibility:
  ma_show: !!bool true

colors:
  white: !!str &white "#FDFDFD"
  grey: !!str &grey "#52616B"
  blue_purple: !!str &blue_purple "#8785A2"
  terakotta: !!str &terakotta "#E84A5F"
  pearl_night: !!str &pearl_night "#112D4E"
  krayola_green: !!str &krayola_green "#1CAC78"

figure_settings:
  height_main_fig: !!int 7
  width_main_fig: !!int 18
  left_xlim_acf: !!float 0.
  right_xlim_acf: !!float 4.
  left_xlim_pdf: !!float -9
  right_xlim_pdf: !!float 9
...
    

Π’ figure_examples хранятся дСмонстрационныС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сцСнария python_scripts/main.py, Π° прямыС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² – ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ figures.

Π£ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠΌ коррСляционной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ процСсса ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° kind_acf. Бмысл ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (w_star, w0, alpha ΠΈ Ρ‚.Π΄.) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ понятСн ΠΈΠ· ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π².

Для запуска прилоТСния слСдуСт ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ:

start_app.sh
        $ python python_scripts/main.py \
    --config-path configs/gauss_processes_acf.yaml \
    --output-fig-path figures/your_output_image_name.pdf

    

Ѐункция cmd_line_parser ΠΈΠ· модуля helper_funcs_and_class_schema.py ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ значСния Ρ„Π»Π°Π³ΠΎΠ² (--config-path, --output-fig-path), Π° Π·Π°Ρ‚Π΅ΠΌ Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ Ρ„Π°ΠΉΠ»Π° с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ Π°Π½Π°Π»ΠΈΠ·Π° псСвдослучайного процСсса.

Π—Π°Ρ‚Π΅ΠΌ, функция read_yaml_file ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ Ρ‚ΠΈΠΏΡ‹ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Если Ρ‚ΠΈΠΏΡ‹ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ ΠΈ ошибок Π½Π΅Ρ‚, Ρ‚ΠΎ функция Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Params, ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠΉ Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ. ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ сводку с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ draw_graph.

ΠŸΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ YAML-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лСгковСсной yq), Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ sed, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ» доступСн Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм.

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π΄Π°ΠΆΠ΅ Π½Π΅ открывая ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π° Π±Π°Π·Π΅ этого ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ

sed_example.sh
        $ sed 's/w0: !!float 3.0/w0: !!float 3.15' \
    configs/gauss_processes_acf.yaml \
        > configs/gauss_expacf_w0=3.15.yaml
    

Π—Π΄Π΅ΡΡŒ sed ΠΈΡ‰Π΅Ρ‚ строку Β«w0: !!float 3.0Β», замСняСт Π΅Π΅ строкой Β«w0: !!float 3.15Β» ΠΈ записываСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ (>) Π² Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

На рисунках Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Python-прилоТСния с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ комбинациями ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

<i>Π‘Π²ΠΎΠ΄ΠΊΠ° ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρƒ выбросов стационарного гауссовского псСвдослучайного процСсса с коррСляционной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°</i>
Π‘Π²ΠΎΠ΄ΠΊΠ° ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρƒ выбросов стационарного гауссовского псСвдослучайного процСсса с коррСляционной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°
<i>Π‘Π²ΠΎΠ΄ΠΊΠ° ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρƒ выбросов стационарного гауссовского псСвдослучайного процСсса с коррСляционной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ-косинусного Ρ‚ΠΈΠΏΠ°</i>
Π‘Π²ΠΎΠ΄ΠΊΠ° ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρƒ выбросов стационарного гауссовского псСвдослучайного процСсса с коррСляционной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ-косинусного Ρ‚ΠΈΠΏΠ°
<i>Π‘Π²ΠΎΠ΄ΠΊΠ° ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρƒ выбросов стационарного гауссовского псСвдослучайного процСсса с коррСляционной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ-косинусно-синусного Ρ‚ΠΈΠΏΠ° (минус)</i>
Π‘Π²ΠΎΠ΄ΠΊΠ° ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρƒ выбросов стационарного гауссовского псСвдослучайного процСсса с коррСляционной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ-косинусно-синусного Ρ‚ΠΈΠΏΠ° (минус)
<i>Π‘Π²ΠΎΠ΄ΠΊΠ° ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρƒ выбросов стационарного гауссовского псСвдослучайного процСсса с коррСляционной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ-косинусно-синусного Ρ‚ΠΈΠΏΠ° (плюс)</i>
Π‘Π²ΠΎΠ΄ΠΊΠ° ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρƒ выбросов стационарного гауссовского псСвдослучайного процСсса с коррСляционной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ-косинусно-синусного Ρ‚ΠΈΠΏΠ° (плюс)

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Из руководства Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ:

  • ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ пригодится Π² Ρ€ΠΎΠ»ΠΈ тСкстового интСрфСйса ΠΊ Python-прилоТСниям;
  • ΠΊΠ°ΠΊΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ Π³Π΄Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π³Ρ€Π°Π½ΠΈΡ†Π° области примСнимости ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ…;
  • ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ синтаксис YAML-Ρ„Π°ΠΉΠ»ΠΎΠ² – якоря, псСвдонимы, ΠΊΠ»ΡŽΡ‡ΠΈ слияния – для упрощСния описания ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²;
  • Π² ΠΊΠ°ΠΊΠΈΡ… сцСнариях ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ связку Β«ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» + Python-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β» ΠΈ Π² Ρ‡Π΅ΠΌ сильная сторона Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°;
  • ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования тСкстовых интСрфСйсов Π² Π·Π°Π΄Π°Ρ‡Π΅ обнаруТСния выбросов;
  • Π° Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ Β«Π²ΠΈΠ½Ρ‚Π°ΠΆΠ½Ρ‹Π΅Β» инструмСнты – Vim ΠΈ sed – ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ рСдактирования тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ².

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ источники:

БвязныС ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ с ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Proglib:

ΠœΠ•Π ΠžΠŸΠ Π˜Π―Π’Π˜Π―

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•