File konfigurasi python

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:


 # settings.py TWITTER_USERNAME="johndoe" TWITTER_PASSWORD="johndoespassword" TWITTER_TOKEN="......." 

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 #   config = configparser.ConfigParser() #    config.read("settings.ini") #   print(config["Twitter"]["username"]) #     ! # 'johndoe' 

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:


 # settings.py from betterconf import Config, field class TwitterConfig(Config): #  ,    `Config` username = field("TWITTER_USERNAME", default="johndoe") #   `username`,    ,   password = field("TWITTER_PASSWORD", default="johndoespassword") #  token = field("TWITTER_TOKEN", default=lambda: raise RuntimeError("Account's token must be defined!") #   ,      cfg = TwitterConfig() print(cfg.username) # 'johndoe' 

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): #     SETTINGS_JSON_FILE = "settings.json" #      def __init__(self): with open(self.SETTINGS_JSON_FILE, "r") as f: self._settings = json.load(f) #    def get(self, name): return self._settings.get(name) #    -  ,  - None.     ,   None. provider = JSONProvider() class TwitterConfig(Config): username = field("twitter_username", provider=provider) #      # ... cfg = TwitterConfig() # ... 

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 #     2  from betterconf.caster import to_bool, to_int class TwitterConfig(Config): # ... post_tweets = field("TWITTER_POST_TWEETS", caster=to_bool) # ... 

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("-", ".") #     to_dot = DashToDotCaster() # ... 

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.

Source: https://habr.com/ru/post/id485236/


All Articles