我正在深入研究Python的世界,通过为我的dvd集合编写一个基于清单的简单应用程序作为练习来熟悉sqlite3的一种方法。
在我的项目中,我正在使用一个ini文件进行设置,然后从另一个文件中调用的共享库中读取该文件中的值。我很想反馈我的方法,尤其是对配置文件的使用以及有关该文件的最佳编码实践。
配置的格式如下,名为config.ini
sub_category_id|category_id
101 |1
102 |1
103 |1
201 |2
然后我的utils库的格式如下:
print(mlp.predict(scaler.transform(test_val)))
最后,我的测试查找功能是:
[main]
appversion = 0.1.0
datasource = data\database.db
我最大的问题是关于从utils.py内部建立数据连接的问题。首先,我正在读取文件,然后在同一脚本中形成表单,并从ini文件中的设置建立数据连接。然后由其他文件读取。这是我尝试模块化的方法,但是我不确定它是否正确。
谢谢。
答案 0 :(得分: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
的一个实例就足够了,然后该模块将保存所有其他共享对象。