配置文件 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
的一个实例就足够了,然后该实例包含所有其他共享对象。
我正在深入 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
的一个实例就足够了,然后该实例包含所有其他共享对象。