CherryPy中Python方法的默认参数初始化问题

2024-09-29 19:33:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段工作正常的功能代码(在单线程环境中)

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环境中,我看到了一个非常有趣的现象,对此我没有解释。在

^{pr2}$

失败的原因

在线程中创建的SQLite对象只能在同一线程中使用线程。那个对象是在线程id中创建的。。。

我了解在多线程环境中使用sqlite的含义。。。但这意味着在下面的行中,默认值被分配到另一个线程中

def __init__(self, database = SQLEngine('etc.db'):

对于我的问题,最简单的解决方法是提供一个显式的db值

adapter = EntityAdapter(SQLEngine('etc.db')) //works
adapter.addFeature(1, 'super feature')

我想知道如何在不同的线程中计算默认值?在


Tags: pathselfiddbadapter环境initdef
1条回答
网友
1楼 · 发布于 2024-09-29 19:33:55

在Python中,函数的默认参数是在定义函数时绑定的,而不是在调用函数时绑定的。这意味着每次使用默认参数调用init函数时,都会使用相同的数据库对象实例。因此,如果不使用参数构造EntityAdapter的多个实例,则每个实例都将引用同一个数据库对象。你想做的是以下几点。在

def __init__(self, database = None):
    if database is None:
        self.db = SQLEngine('etc.db')
    else:
        self.db = database

相关问题 更多 >

    热门问题