Konfigurasi. Semua menyimpannya dengan cara yang berbeda. Seseorang di .yaml
, seseorang di .ini
, dan seseorang di kode sumber, berpikir bahwa "Django Path" dengan settings.py
benar-benar bagus.
Pada artikel ini, saya ingin mencoba menemukan cara yang ideal (kemungkinan besar) untuk menyimpan dan menggunakan file konfigurasi dengan Python. Yah, bagikan juga pustaka Anda untuk mereka :)
Percobaan nomor 1
Bagaimana dengan menyimpan konfigurasi dalam kode? Ya, jenis kenyamanan apa, dan Anda tidak perlu belajar bahasa baru. Ada banyak proyek di mana metode ini digunakan, dan saya ingin mengatakan, cukup berhasil.
Konfigurasi khas dalam gaya ini terlihat seperti ini:
Itu terlihat bagus. Hanya satu hal yang mengkhawatirkan, mengapa data keamanan disimpan dalam kode? Bagaimana kita akan melakukan ini? Teka-teki itu. Kecuali untuk .gitignore
file kami di .gitignore
, tetapi ini, tentu saja, bukan solusi sama sekali.
Lagi pula, mengapa setidaknya beberapa data disimpan dalam kode? Menurut saya, kode itu juga kode yang harus menjalankan beberapa jenis logika , dan tidak menyimpan data.
Pendekatan ini sebenarnya banyak digunakan di mana. Di Django yang sama. Semua orang berpikir bahwa karena ini adalah kerangka kerja paling populer yang digunakan di Instagram, mereka tidak akan menyarankan hal buruk. Sangat disayangkan bahwa hal ini tidak terjadi.
Sedikit lagi tentang ini .
Percobaan nomor 2
Yah, karena kami memutuskan bahwa menyimpan data dalam kode tidak keren, mari mencari alternatif. Sejumlah besar format yang berbeda telah ditemukan untuk file konfigurasi, toml
popularitas besar.
Tapi kita akan mulai dengan apa yang Python sendiri tawarkan kepada kita - .ini
. Perpustakaan standar memiliki perpustakaan configparser
.
Konfigurasi kami, yang sudah kami tulis sebelumnya:
# settings.ini [Twitter] username="johndoe" password="johndoespassword" token="....."
Sekarang baca dengan Python:
import configparser
Semua masalah teratasi. Data tidak disimpan dalam kode, akses mudah. Tapi ... dan jika kita perlu membaca konfigurasi lain, yah ada json
atau yaml
misalnya, atau sekaligus. Tentu saja, ada json
di perpustakaan standar dan pyyaml
, tetapi Anda harus menulis banyak kode (baik, atau tidak benar-benar) untuk ini.
Dokumentasi
Percobaan nomor 3
Dan sekarang, saya ingin menunjukkan kepada Anda perpustakaan saya, yang dirancang untuk menyelesaikan semua masalah ini (baik, atau setidaknya mengurangi penderitaan Anda :)).
Ini disebut betterconf
dan tersedia di PyPi.
Instalasi sesederhana perpustakaan lain:
pip install betterconf
Awalnya, konfigurasi kami disajikan sebagai kelas dengan bidang:
Secara default, pustaka mencoba mengambil nilai dari variabel lingkungan, tetapi kami juga dapat mengonfigurasi ini:
from betterconf import Config, field from betterconf.config import AbstractProvider import json class JSONProvider(AbstractProvider):
Dari contoh ini, kita dapat menggunakan berbagai penyedia untuk menerima data. Dan kadang-kadang memang nyaman, kataku dari pengalaman pribadi.
Nah, bagaimana jika kita memiliki nilai atau angka boolean dalam konfigurasi, mereka akhirnya akan tetap dalam bentuk string. Dan untuk ini ada solusinya:
from betterconf import Config, field
Dengan demikian, semua nilai yang mirip dengan tipe Boolean (yaitu true
dan false
akan dikonversi ke Python bool
. bool
tidak case-sensitive.
Menulis kastor juga mudah:
from betterconf.caster import AbstractCaster class DashToDotCaster(AbstractCaster): def cast(self, val): return val.replace("-", ".")
Repositori Github dengan dokumentasi yang lebih rinci .
Ringkasan
Jadi, kami sampai pada kesimpulan bahwa menyimpan pengaturan dalam kode sumber tidak baik. Untuk ini, berbagai format telah ditemukan. Yah, dan Anda bertemu dengan perpustakaan lain yang berguna (seperti yang saya kira :)).
PS
Ya, Anda juga bisa menyertakan Pydantic
, tapi saya percaya itu terlalu ringan untuk tugas-tugas seperti itu.