我是Python新手并尝试使用sqlite3创建一个简单的电话簿。我的问题是我有一个装饰器将所有字符串更改为小写,所以当我调用displayPerson函数时,它会将所有内容更改为小写。我的问题是,我可以将ben.displayPerson中的属性元组返回到'conn.execute insert values'语句,而不是将ben.name,ben.age,ben.phone(这会忽略装饰器)。
#A decorator to correct uppercase strings
def lowercasewrapper(func):
def wrapper(*args, **kwargs):
return [item.lower() for item in func(*args, **kwargs)]
return wrapper
class People():
numofpeeps = 0
def __init__(self, name, age, phone, fblink):
self.name=name
self.age=age
self.phone=phone
self.fblink=fblink
People.numofpeeps += 1
@lowercasewrapper
def displayPerson(self):
return self.name, self.age, self.phone, self.fblink
ben=People("bEn", "10 years old", "503-405-4021", "http://facebook.com/ben")
#sqlite section
import sqlite3
conn = sqlite3.connect('addressbook.db')
cur=conn.cursor()
conn.execute('''
CREATE TABLE people(name TEXT,
age TEXT, phone TEXT, fblink TEXT)''')
conn.execute("insert into people values (?, ?, ?, ?)", (ben.displayPerson))
cur.close()
conn.commit()
conn.close()
我在python解释器中遇到的错误说:
line 33, in <module>
conn.execute("insert into people values (?, ?, ?, ?)", (ben.displayPerson))
ValueError: parameters are of unsupported type
注意:如果我执行conn.execute,则此方法有效 (“插入人值(?,?,?,?)”,(ben.name,ben.age,ben.phone))
但是,我想事先使用装饰器,我无法弄清楚如何做到这一点。
答案 0 :(得分:2)
问题是你没有调用 ben.displayPerson
,你只是引用了这个方法本身。
只需将其更改为:
conn.execute("insert into people values (?, ?, ?, ?)", (ben.displayPerson()))
但是,你也应该摆脱那些额外的括号:
conn.execute("insert into people values (?, ?, ?, ?)", ben.displayPerson())
在括号中加上一个值什么都不做,除非让人类读者混淆,认为你在不知道的情况下将值包装在1项元组中。*
*在某些情况下,如果值是生成器表达式或lambda表达式,则需要在其周围添加额外的括号以防止解析器混淆。对于非常复杂的表达式,它可能使事情更具可读性。当然,对于元组中的多个值,括号几乎不会受到伤害。但是对于单一的,简单的价值,不要这样做。