我有一段功能正常的代码(在单线程环境中)
class SQLEngine(object):
def __init__(self, DB_PATH, referential_integrity=False):
self.path = DB_PATH
self.con = sqlite.connect(DB_PATH)
self.cur = self.con.cursor()
if referential_integrity:
self.executeUpdate('PRAGMA foreign_keys = ON')
class EntityAdapter(object):
def __init__(self, database = SQLEngine('etc.db'):
self.db = database
def addFeature(self, feature_id, description):
self.db.executeUpdateAndCommit('INSERT INTO features (id, description) values (?, ?)', (feature_id,description))
adapter = EntityAdapter()
adapter.addFeature(1, 'super feature')
然而在CherryPy环境中,我看到一个非常有趣的现象,我没有解释。
adapter = EntityAdapter() //Does not work
adapter.addFeature(1, 'super feature')
失败
在一个线程中创建的SQLite对象只能在同一个线程中使用。该对象是在线程ID中创建的......
我理解在多线程环境中使用sqlite的含义......但这意味着在下面的行中,默认值是在不同的线程中分配的
def __init__(self, database = SQLEngine('etc.db'):
我的问题最简单的解决方法是提供一个显式的db值
adapter = EntityAdapter(SQLEngine('etc.db')) //works
adapter.addFeature(1, 'super feature')
我想知道如何在不同的线程中计算默认值?
答案 0 :(得分:2)
在Python中,函数的默认参数在定义函数时绑定,而不是在调用函数时绑定。这意味着每次使用默认参数调用 init 函数时,都会使用相同的数据库对象实例。因此,如果构造多个不带参数的EntityAdapter实例,则每个实例都将引用相同的数据库对象。你想要做的是以下几点。
def __init__(self, database = None):
if database is None:
self.db = SQLEngine('etc.db')
else:
self.db = database