Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Super lengkap! Cara biasa untuk menulis fail konfigurasi dalam Python

Super lengkap! Cara biasa untuk menulis fail konfigurasi dalam Python

王林
王林ke hadapan
2023-04-11 22:22:051482semak imbas

Super lengkap! Cara biasa untuk menulis fail konfigurasi dalam Python

Mengapa menulis fail konfigurasi

Kami boleh menulis fail tetap ini terus ke dalam fail .py, seperti settings.py atau config.py ini ialah ia boleh Di bawah projek yang sama, anda boleh mengimport bahagiannya secara langsung melalui import; tetapi jika kita perlu berkongsi fail konfigurasi pada platform bukan Python yang lain, menulis satu .py bukanlah pilihan yang baik. Pada masa ini kita harus memilih jenis fail konfigurasi biasa untuk menyimpan bahagian tetap ini. Pada masa ini, jenis format fail konfigurasi yang biasa digunakan dan popular terutamanya termasuk ini, json, toml, yaml, xml, dll. Kami boleh menghuraikan jenis fail konfigurasi ini melalui perpustakaan standard atau perpustakaan pihak ketiga.

ini

ini bermaksud Inisialisasikan Pada zaman awal, ia adalah format storan fail konfigurasi pada Windows. Kaedah penulisan fail ini mudah difahami dan selalunya agak mudah Ia biasanya terdiri daripada bahagian, kunci dan nilai, seperti bentuk berikut:

[localdb]
host = 127.0.0.1
user = root
password = 123456
port = 3306
database = mysql

Perpustakaan standard configparser terbina dalam Python, kami. boleh terus menggunakannya untuk menghuraikan fail ini. Sebagai contoh, kami menyimpan kandungan di atas dalam fail bernama db.ini, kemudian gunakan kaedah read() untuk menghuraikan dan membaca, dan akhirnya menggunakan kaedah item() untuk mendapatkan semua pasangan nilai kunci di bawah nod yang ditentukan.

>>> from configparser import ConfigParser
>>> cfg = ConfigParser()
>>> cfg.read("/Users/Bobot/db.ini")
['/Users/Bobot/db.ini']
>>> cfg.items("localdb")
[('host', '127.0.0.1'), ('user', 'root'), ('password', '123456'), ('port', '3306'), ('database', 'mysql')]

Perlu diambil perhatian bahawa configparser membentangkan nilai dalam bentuk rentetan secara lalai, jadi inilah sebabnya kami tidak menambah petikan dalam fail db.ini tetapi terus menulis sebab literal di atas.

Selepas memperoleh pasangan nilai kunci, saya sebenarnya menukarnya terus kepada kamus, dan kemudian membongkar parameter untuk memastikan kod mudah:

#!pip install pymysql
import pymysql
from configparser import ConfigParser
cfg = ConfigParser()
cfg.read("/Users/Bobot/db.ini")
db_cfg = dict(cfg.items("localdb"))
con = pymysql.connect(**db_cfg)

json

Format json boleh dikatakan sebagai format fail biasa untuk kami, dan ia juga merupakan format pertukaran data yang popular di Internet. Selain itu, json kadangkala juga merupakan jenis fail konfigurasi.

Sebagai contoh, npm (alat pengurusan pakej JavaScript serupa dengan pip Python) dan editor VSCode yang digunakan secara meluas yang dihasilkan oleh Microsoft semuanya menggunakan json untuk menulis parameter konfigurasi.

Seperti configparser, Python juga mempunyai perpustakaan standard json terbina dalam, yang boleh mengimport fail dan rentetan kandungan json melalui kaedah load() dan loads().

{
 "localdb":{
 "host": "127.0.0.1",
 "user": "root",
 "password": "123456",
 "port": 3306,
 "database": "mysql"
 }
}

Kami menyimpan kandungan di atas sebagai db.json dan kemudian membaca dan menghuraikannya Agak mudah dan mudah untuk perpustakaan json membaca fail json, dan mudah untuk menghuraikan ke dalam objek kamus Python. .

>>> import json
>>> from pprint import pprint
>>>
>>> with open('/Users/Bobot/db.json') as j:
... cfg = json.load(j)['localdb']
...
>>> pprint(cfg)
{'database': 'mysql',
'host': '127.0.0.1',
'password': '123456',
'port': 3306,
'user': 'root'}

Kelemahan menggunakan konfigurasi fail json ialah standard sintaks adalah terhad dengan ketat Salah satu kritikan adalah mustahil untuk menulis komen di dalamnya, melainkan superset lain jenis json digunakan sebagai. alternatif (boleh ditulis dalam VSCode Fail konfigurasi parameter json beranotasi adalah satu alternatif pada masa yang sama, terdapat masalah bersarang terlalu dalam, yang boleh menyebabkan ralat dengan mudah maklumat konfigurasi.

toml

format toml (atau format tml) ialah format fail konfigurasi yang dicadangkan oleh pengasas bersama Github Tom Preston-Werner. Menurut Wikipedia, toml pertama kali dicadangkan pada Julai 2013, tujuh tahun lalu ia juga agak serupa dengan fail yaml yang akan dibincangkan kemudian dalam beberapa aspek, tetapi jika anda tahu yaml Apabila spesifikasi mempunyai berpuluh-puluh halaman (ya, ia adalah; benar-benar berpuluh-puluh halaman...), anda mungkin tidak benar-benar bersedia untuk menulis fail konfigurasi yang rumit, jadi format toml adalah pilihan yang baik.

Format toml adalah lebih kurang seperti berikut:

Super lengkap! Cara biasa untuk menulis fail konfigurasi dalam Python

Dapat dilihat dari sini bahawa toml agak serupa dengan fail ini yang disebut tadi. Tetapi ia meluas lebih daripada ini.

Dalam contoh gambar kita dapat melihat bahawa sebagai tambahan kepada rentetan asas, seperti cap waktu, nilai Boolean, tatasusunan, dll. disokong lagi, dan gayanya sangat serupa dengan tulisan asli Python.

Sudah tentu, saya tidak akan memperkenalkan terlalu banyak spesifikasi format toml di sini Seseorang telah menterjemah dokumen spesifikasi rasmi, dan rakan yang berminat boleh menyemaknya secara langsung.

Pembangun telah mencipta "roda" yang sepadan untuk jenis fail konfigurasi yang sesuai untuk Python Pada masa ini, versi dengan bintang terbanyak pada Github ialah uiri/toml, tetapi versi ini hanya lulus versi v0.5. toml diseragamkan, tetapi ia agak mudah untuk digunakan Kita boleh memasangnya melalui arahan pip

pip install toml

Kaedah penghuraian perpustakaan ini sangat mudah, dan ia juga agak serupa dengan penggunaan penghuraian bagi. perpustakaan json iaitu, penghuraian dilakukan melalui load() atau loads(); penukaran dan eksport juga digunakan dengan cara yang sama.

Sebagai contoh, kita kini menulis kandungan berikut ke dalam config.toml:

[mysql]
host = "127.0.0.1"
user = "root"
port = 3306
database = "test"
 [mysql.parameters]
 pool_size = 5
 charset = "utf8"
 [mysql.fields]
 pandas_cols = [ "id", "name", "age", "date"]

Kemudian kita boleh membacanya melalui kaedah load() dalam perpustakaan toml:

>>> import toml
>>> import os
>>> from pprint import pprint
>>> cfg = toml.load(os.path.expanduser("~/Desktop/config.toml"))
>>> pprint(cfg)
{'mysql': {'database': 'test',
'fields': {'pandas_cols': ['id', 'name', 'age', 'date']},
'host': '127.0.0.1',
'parameters': {'charset': 'utf8', 'pool_size': 5},
'port': 3306,
'user': 'root'}}

Anda dapat melihat bahawa fail toml secara tidak langsung ditukar kepada jenis kamus Sudah tentu, beginilah cara versi json ditulis (hanya gantikan petikan tunggal dengan petikan berganda), yang memudahkan panggilan atau pemindahan parameter kami yang berikutnya.

yaml

yaml 格式(或 yml 格式)是目前较为流行的一种配置文件,它早在 2001 由一个名为 Clark Evans 的人提出;同时它也是目前被广泛使用的配置文件类型,典型的就是 Docker 容器里的 docker-compose.yml 配置文件,如果经常使用 Docker 进行部署的人对此不会陌生。

yaml 文件的设计从 Python、XML 等地方获取灵感,所以在使用时能很清楚地看到这些部分的影子。

在上一节 toml 内容里我曾提到,yaml 的规范内容可以说是冗长和复杂,足足有80页之多。

Super lengkap! Cara biasa untuk menulis fail konfigurasi dalam Python

所以感兴趣的朋友可以再自行了解相关用法。

YAML 官方早已经提供了相应的 Python 库进行支持,即 PyYAML;当然也同样需要我们事先进行安装:

pip install pyyaml

同 json 库和 toml 库一样,通过 load() 方法来进行加载。

需要注意的是,使用 load() 方法会存在一定的安全隐患,从思科 Talos 的这份报告中我们可以看到,如果加载了未知或不信任的 yaml 文件,那么有可能会存在被攻击的风险和网络安全隐患,因为它能够直接调用相应的 Python 函数来执行为攻击者所需要的命令,比如说在 yaml 文件中写入这么一段:

# 使用Linux和macOS的朋友不要轻易尝试
!!python/object/apply:os.system ["rm -rf /"]

因此最好是使用 safe_load() 来代替 load() 方法。

这和 Python 内置的 string 标准库中 Template 类的 substitute() 模板方法一样存在着同样的安全隐患,所以使用 safe_substitute() 来替代是一样的道理。

如我们现在将之前的一些配置信息写入 config.yaml 文件中:

mysql:
 host: "127.0.0.1"
 port: 3306
 user: "root"
 password: "123456"
 database: "test"
 parameter:
 pool_size: 5
 charset: "utf8"
 fields:
pandas_cols:
 - id
 - name
 - age
 - date

然后我们通过 safe_load() 方法进行解析:

>>> import os
>>> from pprint import pprint
>>>
>>> with open(os.path.expanduser("~/config.yaml"), "r") as config:
... cfg = yaml.safe_load(config)
...
>>> pprint(cfg)
{'mysql': {'database': 'test',
'fields': {'pandas_cols': ['id', 'name', 'age', 'date']},
'host': '127.0.0.1',
'parameter': {'charset': 'utf8', 'pool_size': 5},
'password': '123456',
'port': 3306,
'user': 'root'}}

可以看到最后结果和前面的 toml 库的解析结果基本一致。

结尾

本文列举了一些主流且常见的配置文件类型及其 Python 的读取方法,可能有的读者会发现当中没有 xml 格式类型的内容。对于 xml 配置文件可能与 Java 系语言打交道的朋友遇见得会多一些,但 xml 文件的可读性实在是让人望而生畏;对 xml 文件不了解的朋友可以使用 Chrome 浏览器随便进入一个网站然后按下 F12 进入开发者后查看那密密麻麻的 html 元素便是 .xml 的缩影。

除了这些主流的配置文件类型之外,像一些 .cfg、.properties 等都可以作为配置文件,甚至和开头提到的那样,你单独用一个 .py 文件来书写各类配置信息作为配置文件进行导入都是没问题,只是在跨语言共享时可能会有些障碍。因此本文就不过多介绍,感兴趣的朋友可以进一步自行了解。

在本文里列举的配置文件类型其复杂性由上到下依次增加:ini

Atas ialah kandungan terperinci Super lengkap! Cara biasa untuk menulis fail konfigurasi dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam