配置文件 python

config files with python

我正在深入 Python 的世界,通过为我的 dvd collection 编写一个简单的基于库存的应用程序来练习,作为熟悉使用 sqlite3 的一种方式。

作为我项目的一部分,我使用 ini 文件进行设置,然后从另一个文件调用的共享库中读取该文件的值。我很好奇关于我的方法的反馈,尤其是我对配置文件的使用,以及围绕它的最佳编码实践。

配置格式如下,命名为config.ini

[main]
appversion = 0.1.0
datasource = data\database.db

我的utils库然后格式化如下:

import os
import sqlite3
from configparser import ConfigParser


CONFIG_PATH = os.path.join(os.path.dirname(__file__), 'config/config.ini')


def get_settings(config_path=CONFIG_PATH):
    config = ConfigParser()
    config.read(config_path)
    return config


def db_connect():
    config = get_settings()
    con = sqlite3.connect(config.get('main', 'datasource'))
    return con

最后,我的测试查找功能是:

from utils import db_connect


def asset_lookup():
    con = db_connect()
    cur = con.cursor()
    cur.execute("SELECT * FROM dvd")
    results = cur.fetchall()
    for row in results:
        print(row)

我最大的问题是关于我在 utils.py 内部建立数据连接。首先,我正在读取文件,然后在同一个脚本中形成,从 ini 文件中的设置构建数据连接。然后由其他文件读取。这是我尝试模块化的方法,但我不确定它是否合适。

提前致谢。

要直接回答您的问题,您可以执行类似这样的操作来缓存您的对象,这样您就不会在调用 utils.py 中的某个函数时一遍又一遍地 create/open 它们:

import os
import sqlite3
from configparser import ConfigParser

CONFIG_PATH = os.path.join(os.path.dirname(__file__), 'config/config.ini')
config = None
con = None

def get_settings(CONFIG_PATH):
    global config 
    if config is None:
        config = ConfigParser()
        config.read(CONFIG_PATH)
    return config


def db_connect():
    global con
    if con is None:
        config = get_settings()
        con = sqlite3.connect(config.get('main', 'datasource'))
    return con

虽然这可能会解决您的问题,但它在很大程度上依赖于全局变量,这可能会在其他地方引起问题。通常,这就是您切换到 类 作为属于一起的代码部分的容器的地方。例如:

import os
import sqlite3
from configparser import ConfigParser

class DVDApp:
    CONFIG_PATH = os.path.join(os.path.dirname(__file__), 'config/config.ini')

    def __init__(self):
        self.config = ConfigParser()
        self.config.read(self.CONFIG_PATH)        
        self.con = sqlite3.connect(self.config.get('main', 'datasource'))        

    def asset_lookup(self):        
        cur = self.con.cursor()
        cur.execute("SELECT * FROM dvd")
        results = cur.fetchall()
        for row in results:
            print(row)

初始化 self 中保存的配置和连接对象减少到仅 3 行代码。因此几乎没有必要将代码拆分为多个文件。即使是这样,在模块之间共享 DVDApp 的一个实例就足够了,然后该实例包含所有其他共享对象。