我們編寫了許多需要透過外部屬性進行自訂的Python應用程序,或者我們希望使用非硬編碼屬性和/或運行時配置屬性來自訂或影響行為的應用程式。 對解決方案的各種 Google 搜尋都會產生教程,這些教程向我們提供了程式碼範例,雖然實際上可以工作,但無法針對現實世界的應用程式進行適當的擴展。
這組文章記錄了我在實作一個簡單、可維護且易於擴展的機制來管理應用程式配置屬性的過程中反覆重構和重新實現的各種實作過程。
我發現的教程版本只是庫開發人員提供的程式碼片段的擴展,以證明他們的實作有效。 雖然這足以提供概念證明,但這些片段在應用程式的現實世界中無法擴展。
以下程式碼片段就是一個範例。
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()
雖然這個程式碼片段確實允許我們保存我們的配置值,但它給我們留下了讀取這些保存值的問題。 同樣,實作開發人員片段為我們提供了有關如何檢索這些值的範例程式碼,如下列程式碼片段所示。
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'])
我在上面的程式碼中發現了很多問題。 雖然對於小腳本來說這是完全可以接受的,但程式碼會受到與實際 Python 變數名稱相關的字串值的使用及其在大型程式碼庫中潛在擴散的影響。 雖然使用全局常數可能會緩解這種情況,但我認為這是不可擴展的,因為它不遵循Andrew Hunt 和David Thomas 在他們的開創性著作《實用程式設計師》中所倡導的基本軟體設計原則,並且未能通過DRY原則,又稱為「不要重複自己」。
本文的原始碼在這裡。
請參閱我的下一篇文章,其中記錄了解決我概述的一些問題的初步實施。
以上是邁向輕鬆的 Python 設定檔版本 Ø的詳細內容。更多資訊請關注PHP中文網其他相關文章!