Hasilkan file YAML dari python dengan kunci dan nilai tertentu dengan tanda kutip ganda

Baru-baru ini Ubuntu mulai dikirimkan dengan netplan. Untuk itu diperlukan konfigurasi yaml untuk mengatur antarmuka jaringan. Jadi misalnya memerlukan yaml berikut untuk mengatur WiFi:

network:
    version: 2
    renderer: NetworkManager
    wifis:
        interface_name:
            access-points:
                "apn":
                    password: "pwd"
            nameservers:
                addresses: [8.8.4.4, 8.8.8.8]
            dhcp4: true

Perhatikan pada titik akses, nama_ssid_jaringan (apn) dan nilai kolom kata sandi (pwd) diberi tanda kutip ganda.

Saya melihat sekeliling pada stack overflow dan menemukan ini

Namun solusi ini memerlukan instalasi modul dari pip call ruamel.yaml. Saya ingin mencapai ini menggunakan modul PyYAML yang sudah tersedia di distribusi python saya.

Berikut beberapa hal yang telah saya coba sejauh ini:

import yaml

d = {'network': {'version': 2, 'renderer': 'NetworkManager', 'wifis':{'wlp58s0': {'access-points': {b'apn': {'password': b'pwd'}}}}}}


with open('/home/edyza/result.yml', 'w') as yaml_file:
    yaml.dump(d, yaml_file, default_flow_style=False, default_style=None)

Output dari ini adalah

network:
  renderer: NetworkManager
  version: 2
  wifis:
    wlp58s0:
      access-points:
        apn:
          password: pwd

Sekarang saya mencoba menggunakan karakter escape dan beberapa hal lainnya

import yaml

d = {'network': {'version': 2, 'renderer': 'NetworkManager', 'wifis':{'wlp58s0': {'"access-points"': {'apn': {'password': "\"pwd\""}}}}}}

with open('/home/edyza/result.yml', 'w') as yaml_file:
    yaml.dump(d, yaml_file, default_flow_style=False, default_style=None)

Kemudian outputnya berubah menjadi

network:
  renderer: NetworkManager
  version: 2
  wifis:
    wlp58s0:
      '"access-points"':
        apn:
          password: '"pwd"'

Perubahan apa yang dapat saya lakukan untuk mencapai keluaran yang diinginkan dengan tanda kutip ganda pada kunci dan nilai yang sesuai tanpa menggunakan modul pihak ketiga?

Atau adakah pendekatan lain yang harus saya pertimbangkan untuk menghasilkan file yaml.


person A Saxena    schedule 20.06.2019    source sumber
comment
Saya cukup yakin tidak ada modul YAML yang dikirimkan dengan Python 2.7 atau 3.x, baik ruamel.yaml, maupun PyYAML atau PySyck (keduanya hanya mendukung versi YAML yang sudah usang satu dekade atau lebih yang lalu). Harap berikan referensi (misalnya di repositori Python) tentang apa yang akan menjadi *modul yaml yang dikirimkan secara default dengan python`, sehingga kami tahu apa yang Anda maksud.   -  person Anthon    schedule 23.06.2019
comment
@Anthon Anda benar. Saya baru saja melakukan impor yaml dan berasumsi bahwa yaml dikirimkan secara default dengan python. Itu tidak benar. Saya akan memperbarui pertanyaan untuk mencerminkan hal itu. Saya menggunakan PyYAML.   -  person A Saxena    schedule 24.06.2019


Jawaban (1)


Di YAML, mengutip string tidak diperlukan kecuali untuk kasus khusus (jika string dimulai dengan karakter khusus, jika berisi karakter kontrol atau :<SPACE>).

Untuk referensi, bolehkah saya merekomendasikan artikel tentang kutipan YAML?

Saya rasa kecil kemungkinan parser netplan YAML benar-benar memerlukan tanda kutip tersebut. Sudahkah Anda mencobanya tanpa tanda kutip dan apakah Anda mendapatkan kesalahan?

person tinita    schedule 16.07.2019