gpt4 book ai didi

python - 不同的功能,相同的结果

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:38 25 4
gpt4 key购买 nike

因此,我尝试动态地将属性设置为具有不同名称的类,其中每个属性对我的数据库进行唯一的调用。但是,当我访问属性对象时,尽管在不同的列上查找每个值完全不同的值,但它们都返回相同的结果。这是代码:

class Configs:

def __init__(self, guild_id):
self.guild_id = guild_id

for x in configs:

def fget(self):
return cur.execute(f'SELECT {x.name} FROM configs WHERE guild_id = ?', (self.guild_id,)).fetchone()[0], x.name

def fset(self, value):
cur.execute(f'UPDATE configs SET {x.name} = ? WHERE guild_id = ?', (value, self.guild_id))
con.commit()

setattr(Configs, x.name, property(fget, fset))

configs 变量是一个对象列表,其中每个对象都有一个指向字符串的 name 属性。结果始终是 configs 数组的最后一个元素产生的结果,我怀疑发生这种情况是因为 x.name 用于进行调用,一旦 for 循环完成,x 仍为数组的最后一个元素。

最佳答案

您有一种错误的印象,认为定义函数会在定义时将函数绑定(bind)到变量值。这听起来很复杂,抱歉。我会尽力解释。

您正在循环中定义函数(fgetfset)。在函数中,您使用循环变量 (x)。这会起作用,但不会以您期望的方式起作用。所有函数都完全相同,总是在调用时访问全局变量 x 的值。不考虑定义时的值。

例如,参见:

a = []
for i in range(3):
def f(): return i
a.append(f)

a[0]() # will return 2
del i
a[0]() # will raise a NameError because there is no i anymore

要解决您的问题,您需要在定义时将值传递到函数中:

def fget(self, x=x):
return cur.execute(f'SELECT {x.name} FROM configs WHERE guild_id = ?', (self.guild_id,)).fetchone()[0], x.name

def fset(self, value, x=x):
cur.execute(f'UPDATE configs SET {x.name} = ? WHERE guild_id = ?', (value, self.guild_id))
con.commit()

关于python - 不同的功能,相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42623136/

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