2

我是 Python 新手,正在尝试通过创建通讯录来进行实验。我怀疑 displayPerson 函数有问题。我不能同时返回多个变量吗?

def lowercasewrapper(func):
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs).lower()
    return wrapper

#Class with object attributes
class People():
    numofpeeps = 0
    listofpeeps = []
    def __init__(self, name, age, phone, fblink):
        self.name=name
        self.age=age
        self.phone=phone
        self.fblink=fblink
        People.numofpeeps += 1
        People.listofpeeps.append(self.age)

    @lowercasewrapper #calling the wrapper, to make all strings lowercase
    def displayPerson(self): 
        return self.name, self.age, self.phone, self.fblink

george=People("gEORge", "5", "503-405-4021", "http://facebook.com/boobs")
dave=People("dave", "10", "971-863-3905", "http://boobs.com")
charlie=People("CHARLIE", "19", "823-405-2942", "http://boobs.com")

print george.displayPerson()
print "Total number of people: ", People.numofpeeps
print "List of ages: ", People.listofpeeps


error shows the following: File "example.py", line 54, in <module>
    print george.displayPerson()
  File "example.py", line 31, in wrapper
    return func(*args, **kwargs).lower()
AttributeError: 'tuple' object has no attribute 'lower'
4

4 回答 4

1

只是

def myFunc():
    return 1, 2

在来电者中

var1, var2 = yourFunc()
于 2013-10-23T01:33:41.887 回答
1

异常由lowercasewrappernot引发displayPerson。您可以改用它:

def lowercasewrapper(func):
    def wrapper(*args, **kwargs):
        return [x.lower() for x in func(*args, **kwargs)]
    return wrapper

阅读@DonaldMiner 答案以获得更好的解释。

于 2013-10-23T01:35:18.180 回答
1

在这一行:

    return func(*args, **kwargs).lower()

你正在接受它的回报并将其称为更低。当你这样做时:

    return self.name, self.age, self.phone, self.fblink

真正做的是将这 4 个变量打包成一个元组,然后返回它。

所以,不幸的是,你试图调用.lower()一个元组,而不是每个项目。相反,您想通过并调用.lower()内部的所有内容:

def lowercasewrapper(func):
    def wrapper(*args, **kwargs):

        return tuple(item.lower() for item in func(*args, **kwargs))
    return wrapper

这使用列表理解。如果您还没有看到该语法,您可能希望使用 for 循环来迭代每个项目并将其小写。

于 2013-10-23T01:36:15.350 回答
0

当然,您可以从一个函数返回多个值。那不是你的问题。

当你从一个函数返回多个值时,Python 会自动将它们包装在一个元组中。因此,当您调用 时displayPerson,它会返回一个元组,其中包含该人的姓名、年龄、电话号码和 Facebook 链接。

现在,在您的小写包装器中,您从 call 获取结果displayPerson,并lower在其上调用方法。不幸的是,元组没有lower方法。

相反,您需要返回一个新元组,其中每个元素单独转换为小写:

def lowercasewrapper(func):
    def wrapper(*args, **kwargs):
        # Get initial result of your function.
        initial_tuple = func(*args, **kwargs)
        # Create a new tuple consisting of each member of the
        # initial tuple, converted to lower case.
        new_tuple = tuple([x.lower() for x in initial_tuple])
        return new_tuple
    return wrapper

注意:这可以在一行中完成,我在这里使用了一对来说明发生了什么。

于 2013-10-23T01:36:58.657 回答