gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:41:18 27 4
gpt4 key购买 nike

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

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'):

解决我的问题的最简单方法是提供显式的数据库值

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

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

最佳答案

在 Python 中,函数的默认参数是在定义函数时绑定(bind)的,而不是在调用函数时绑定(bind)的。这意味着每次使用默认参数调用 init 函数时,都会使用数据库对象的相同实例。因此,如果您构造不带参数的 EntityAdapter 的多个实例,则每个实例都将引用相同的数据库对象。您想要执行的操作如下。

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

关于CherryPy 中的 Python 方法默认参数初始化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17458952/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com