我是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'
答案 0 :(得分:1)
只是
def myFunc():
return 1, 2
和来电者
var1, var2 = yourFunc()
答案 1 :(得分:1)
lowercasewrapper
而不是displayPerson
引发了异常。您可以改为使用它:
def lowercasewrapper(func):
def wrapper(*args, **kwargs):
return [x.lower() for x in func(*args, **kwargs)]
return wrapper
阅读@DonaldMiner答案以获得更好的解释。
答案 2 :(得分: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
:
{{1}}
这使用list comrpehension。如果您还没有看到这种语法,您可能希望使用for循环迭代每个项目并小写它。
答案 3 :(得分:0)
当然,您可以从函数返回多个值。那不是你的问题。
当您从函数返回多个值时,Python会自动将它们包装在一个元组中。因此,当您致电displayPerson
时,它会返回一个元组,其中包含该人的姓名,年龄,电话号码和Facebook链接。
现在,在您的小写包装器中,您可以通过调用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
注意:这可以在一行中完成,我在这里用了几个来说明发生了什么。