0

我是 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 ("insert into people values (?, ?, ?, ?)", (ben.name, ben.age, ben.phone))

但是,我想事先使用装饰器,但我不知道该怎么做。

4

1 回答 1

2

问题是你没有调用 ben.displayPerson,你只是在引用方法本身。

只需将其更改为:

conn.execute("insert into people values (?, ?, ?, ?)", (ben.displayPerson()))

但是,您还应该去掉那些额外的括号:

conn.execute("insert into people values (?, ?, ?, ?)", ben.displayPerson())

将单个值放在括号中没有任何作用,只会让人类读者误以为您将值包装在 1 项元组中,而实际上并非如此。*


* 在某些情况下,如果值是生成器表达式或 lambda 表达式,则需要在其周围加上额外的括号以防止解析器混淆。对于非常复杂的表达式,它可能会使事情更具可读性。当然,对于一个元组中的多个值,括号几乎不会受到伤害。但是对于一个单一的、简单的价值,不要这样做。

于 2013-10-26T01:32:17.240 回答