Wir schreiben viele Python-Anwendungen, die eine Anpassung über externe Eigenschaften erfordern, oder Anwendungen, deren Verhalten wir mit nicht fest codierten Eigenschaften und/oder Laufzeitkonfigurationseigenschaften anpassen oder beeinflussen möchten. Verschiedene Google-Suchen nach Lösungen führen zu Tutorials, die uns auf Codebeispiele verweisen, die zwar praktisch funktionieren, sich aber für reale Anwendungen nicht angemessen skalieren lassen.
Diese Artikel dokumentieren meinen Weg durch verschiedene Implementierungen, während ich auf meinem Weg zu einem einfachen, wartbaren und leicht erweiterbaren Mechanismus zum Verwalten von Anwendungskonfigurationseigenschaften wiederholt umgestaltete und neu implementierte.
Die Tutorial-Versionen, die ich gefunden habe, waren lediglich Erweiterungen der Codeausschnitte, die die Bibliotheksentwickler bereitstellen, um zu beweisen, dass ihre Implementierungen funktionieren. Obwohl dies ausreicht, um einen Machbarkeitsnachweis zu erbringen, lassen sich die Snippets nicht in der realen Anwendungswelt skalieren.
Ein Beispiel hierfür ist der folgende Codeausschnitt.
import configparser def create_config(): config = configparser.ConfigParser() # Add sections and key-value pairs config['General'] = { 'debug': 'True', 'log_level': 'info' } config['Database'] = { 'db_name': 'example_db', 'db_host': 'localhost', 'db_port': '5432' } with open('config.ini', 'w') as configfile: config.write(configfile) if __name__ == "__main__": create_config()
Während dieser Codeausschnitt es uns sicherlich ermöglicht, unsere Konfigurationswerte beizubehalten, stellt er uns vor das Problem, diese beibehaltenen Werte zu lesen. Auch hier stellen uns die Implementierungsentwickler-Snippets Beispielcode zum Abrufen dieser Werte bereit, wie in den folgenden Code-Snippets dargestellt.
import configparser def read_config(): config = configparser.ConfigParser() config.read('config.ini') # Access values from the configuration file debug_mode = config.getboolean('General', 'debug') log_level = config.get('General', 'log_level') db_name = config.get('Database', 'db_name') db_host = config.get('Database', 'db_host') db_port = config.get('Database', 'db_port') # Return a dictionary with the retrieved values config_values = { 'debug_mode': debug_mode, 'log_level': log_level, 'db_name': db_name, 'db_host': db_host, 'db_port': db_port } return config_values if __name__ == "__main__": # Call the function to read the configuration file config_data = read_config() # Print the retrieved values print('Debug Mode', config_data['debug_mode']) print('Log Level', config_data['log_level']) print('Database Name', config_data['db_name']) print('Database Host', config_data['db_host']) print('Database Port', config_data['db_port'])
Ich sehe viele Probleme im obigen Code. Während dies für kleine Skripte durchaus akzeptabel ist, leidet der Code unter der Verwendung von Zeichenfolgenwerten, die sich auf tatsächliche Python-Variablennamen beziehen, und deren potenzielle Verbreitung über eine große Codebasis. Während dies möglicherweise durch die Verwendung globaler Konstanten gemildert wird, bin ich der Meinung, dass dies nicht skalierbar ist, da es nicht einem grundlegenden Prinzip des Softwaredesigns folgt, das von Andrew Hunt und David Thomas in ihrem bahnbrechenden Buch „The Pragmatic Programmer“ vertreten wurde, und den DRY nicht erfüllt Prinzip, auch bekannt als „Do not Repeat Yourself“.
Der Quellcode für diesen Artikel ist hier.
Siehe meinen nächsten Beitrag, der eine erste Implementierung zur Lösung einiger der von mir beschriebenen Probleme dokumentiert.
Das obige ist der detaillierte Inhalt vonAuf dem Weg zu mühelosen Python-Konfigurationsdateien Version Ø. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!