Python-Konfigurationsdateien

Configs. Alle speichern sie auf unterschiedliche Weise. Jemand in .yaml , jemand in .ini und jemand im Quellcode, der denkt, dass der "Django Path" mit seinen settings.py wirklich gut ist.


In diesem Artikel möchte ich versuchen, die (wahrscheinlichste) ideale Methode zum Speichern und Verwenden von Konfigurationsdateien in Python zu finden. Nun, teile auch deine Bibliothek für sie :)


Versuch Nummer 1


Was ist mit dem Speichern der Konfiguration im Code? Nun, was ist praktisch, und Sie müssen keine neuen Sprachen lernen. Es gibt viele Projekte, in denen diese Methode angewendet wird, und ich möchte sagen, ziemlich erfolgreich.


Eine typische Konfiguration in diesem Stil sieht folgendermaßen aus:


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

Es sieht gut aus Nur eines ist bedenklich, warum werden Sicherheitsdaten im Code gespeichert? Wie werden wir das begehen? Das Rätsel. Abgesehen davon, .gitignore unsere Datei in .gitignore ist, ist dies natürlich keine Lösung.


Wie auch immer, warum sind zumindest einige Daten im Code gespeichert? Wie mir der Code scheint, ist es auch ein Code, der eine Art Logik ausführen und keine Daten speichern muss.


Dieser Ansatz wird tatsächlich häufig verwendet. Im selben Django. Jeder denkt, dass dies das beliebteste Framework ist, das auf Instagram verwendet wird, und dass er keine schlechten Ratschläge gibt. Schade, dass dem nicht so ist.


Ein bisschen mehr dazu .


Versuch Nummer 2


Nun, da wir entschieden haben, dass das Speichern von Daten im Code nicht cool ist, suchen wir nach einer Alternative. Für Konfigurationsdateien wurde eine beträchtliche Anzahl von verschiedenen Formaten erfunden, toml große Popularität erlangt.


Aber wir werden mit dem beginnen, was Python selbst uns bietet - .ini . Die Standardbibliothek verfügt über eine configparser Bibliothek.


Unsere Konfiguration, die wir bereits früher geschrieben haben:


 # settings.ini [Twitter] username="johndoe" password="johndoespassword" token="....." 

Lesen Sie jetzt in Python:


 import configparser #   config = configparser.ConfigParser() #    config.read("settings.ini") #   print(config["Twitter"]["username"]) #     ! # 'johndoe' 

Alle Probleme sind gelöst. Daten werden nicht im Code gespeichert, der Zugriff ist einfach. Aber ... und wenn wir andere Konfigurationen lesen müssen, yaml zum Beispiel json oder yaml oder alles auf einmal. Natürlich gibt es json in der Standardbibliothek und pyyaml , aber Sie müssen dafür eine Menge ( pyyaml oder nicht wirklich) Code schreiben.


Dokumentation


Versuch Nummer 3


Und jetzt möchte ich Ihnen meine Bibliothek zeigen, die darauf ausgelegt ist, all diese Probleme zu lösen (oder zumindest Ihr Leid zu lindern :)).


Es heißt betterconf und ist auf PyPi verfügbar.


Die Installation ist so einfach wie bei jeder anderen Bibliothek:


 pip install betterconf 

Zunächst wird unsere Konfiguration als Klasse mit Feldern dargestellt:


 # 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' 

Standardmäßig versucht die Bibliothek, Werte von Umgebungsvariablen zu übernehmen. Wir können dies jedoch auch konfigurieren:


 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() # ... 

Aus diesem Beispiel folgt, dass wir verschiedene Anbieter verwenden können , um Daten zu empfangen. Und es ist wirklich manchmal praktisch, sage ich aus eigener Erfahrung.


Nun, was ist, wenn wir boolesche Werte oder Zahlen in den Configs haben, werden sie irgendwann sowieso in Strings kommen. Und dafür gibt es eine Lösung:


 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) # ... 

Daher werden alle Werte, die Booleschen Typen ähnlich sind (nämlich true und false , in einen Python- bool konvertiert. Dabei wird die Groß- und Kleinschreibung nicht berücksichtigt.


Es ist auch einfach, einen Caster zu schreiben:


 from betterconf.caster import AbstractCaster class DashToDotCaster(AbstractCaster): def cast(self, val): return val.replace("-", ".") #     to_dot = DashToDotCaster() # ... 

Github-Repository mit detaillierterer Dokumentation .


Zusammenfassung


Daher kamen wir zu dem Schluss, dass das Speichern der Einstellungen im Quellcode nicht gut ist. Hierfür wurden bereits verschiedene Formate erfunden. Nun, und Sie haben sich mit einer anderen nützlichen (wie ich finde :)) Bibliothek getroffen.


PS


Ja, Sie könnten auch Pydantic , aber ich glaube, dass es für solche Aufgaben zu leicht ist.

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


All Articles