【问题标题】:config files with python用python配置文件
【发布时间】:2019-01-14 00:46:50
【问题描述】:

我正在潜入 Python 世界,通过为我的 dvd 收藏编写一个简单的基于库存的应用程序来练习,以此来熟悉使用 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 文件中的设置建立数据连接。然后由其他文件读取。这是我尝试模块化的方法,但我不确定它是否合适。

提前致谢。

【问题讨论】:

  • 这里有问题吗?
  • 简短回答,您不应多次阅读config.iniconfig 应该是一个全局对象。通常,我们有一个名为config.py 的拆分文件,我们from config import config 以全局使用配置对象。

标签: python python-3.x sqlite ini


【解决方案1】:

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

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 的一个实例就足够了,然后它会保存所有其他共享对象。

【讨论】:

  • 您的第二个解决方案运行良好,谢谢!我远不是任何类型的 Python 专家,所以这对我来说是一个很好的学习点。
猜你喜欢
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 2012-08-31
  • 2018-03-17
  • 2016-08-10
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多