Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python初学者:错误代码问题-太多值无法解包(预期为2)_Python_Validation - Fatal编程技术网

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
返回什么,它都应该有两个元素,第一个元素应该分配给name
result
,第二个元素应该分配给name
reason

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