python初学者:错误代码问题-太多值无法解包(预期为2)
该程序旨在接收用户名和密码并对其进行验证。我现在只看用户名部分 这是我的职责:python初学者:错误代码问题-太多值无法解包(预期为2),python,validation,Python,Validation,该程序旨在接收用户名和密码并对其进行验证。我现在只看用户名部分 这是我的职责: def valid_username(username): if not username.isalpha(): reason = ('username can only contain alpha numeric numbers') return reason numupper =0 for c in username: if not c.i
def valid_username(username):
if not username.isalpha():
reason = ('username can only contain alpha numeric numbers')
return reason
numupper =0
for c in username:
if not c.isupper():
numupper = numupper + 1
if numupper <= 0:
reason=('username must contain at least one uppercase character')
return reason
numlower =0
for c in username:
if not c.islower():
numlower = numlower + 1
if numlower <= 0:
reason=('username must contain at least one lowercase character')
return reason
if len(username)<8:
reason = ('username must be greater than 8 characters')
return reason
numdigit=0
for c in username:
if not c.isdigit():
numdigit = numdigit + 1
if numdigit <= 0:
reason= ('username must contain at least one number')
return reason
但我得到了这个错误代码:
Traceback (most recent call last):
File "/Users/katiemoore/Documents/MooreKatie_assign9.py", line 7, in <module>
result, reason = uservalidation.valid_username(username)
ValueError: too many values to unpack (expected 2)
回溯(最近一次呼叫最后一次):
文件“/Users/katiemore/Documents/MooreKatie_assign9.py”,第7行,在
结果,原因=用户验证。有效的\u用户名(用户名)
ValueError:要解压缩的值太多(应为2个)
我真的不知道那是什么意思,有人能帮忙吗 函数
有效\u用户名
只返回一个字符串原因
。但是在函数调用时,您会收到两个参数。因此出现了错误。因此,返回一个空字符串是合适的,因为分配给结果的变量是正确的
而不是
return reason
使用
这将起作用Aswin Murugesh提供的解决方案是正确的,尽管在某些用例中不返回任何值,但原因
可能更合适。但我认为这个解释可以有效地扩展
该语法告诉Python,无论uservalidation.valid\u username
返回什么,它都应该有两个元素,第一个元素应该分配给nameresult
,第二个元素应该分配给namereason
:
result, reason = uservalidation.valid_username(username)
这不是特定于函数调用的,您可以在任何情况下使用这种解包语法。例如:
>>> result, reason = ('foo', 'bar')
>>> result
'foo'
>>> reason
'bar'
如果值的数量不正确,这样解包将引发异常。函数valid\u username
只返回一个值:
return reason
通常,解包将告诉您尝试解包的元素数量是否太少:
>>> result, reason = ('foo',)
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
result, reason = ('foo',)
ValueError: need more than 1 value to unpack
因此,您需要确保解包函数返回值的尝试与函数返回的值相匹配。我不确定函数中的result
应该来自何处,但您应该计算并返回它,返回一个类似None
的占位符作为元组的一部分,或者更改函数返回值的赋值
您不必使用解包来处理返回值-如果指定单个变量名,则无论该变量是单个对象还是元组,都将为该变量分配函数的返回值。同样,函数返回值也没有什么特别之处-其行为与:
>>> foo = 7
>>> bar = (7, 8)
当您不知道调用将返回的元素数时,这可能很有用。例如:
>>> foo = 'foo,foo'.split(',')
>>> bar = 'bar,bar,bar'.split(',')
>>> len(foo)
2
>>> len(bar)
3
底线是,如果要使用解包语法接受函数的多个返回值,则需要确保该函数始终返回准确的值数
>>> result, reason = 7
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
result, reason = 7
TypeError: 'int' object is not iterable
>>> result, reason = 'foobar'
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
result, reason = 'foobar'
ValueError: too many values to unpack
>>> result, reason = 'ab'
>>> result
'a'
>>> reason
'b'
>>> result, reason = 'a'
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
result, reason = 'a'
ValueError: need more than 1 value to unpack
>>> foo = 7
>>> bar = (7, 8)
>>> foo = 'foo,foo'.split(',')
>>> bar = 'bar,bar,bar'.split(',')
>>> len(foo)
2
>>> len(bar)
3