ValueError:需要超过2个值才能在Python 2.6.6中解压缩

时间:2011-04-01 15:58:33

标签: python

我收到错误:ValueError:要解压缩需要2个以上的值 当我现在运行单元测试时,所以2次失败,一次跳过 现在据我所知,

lambda i: get_error_count(self._error_lookup, i))

来源的第142行是方法

for test, err, capt in errors:

具有代码行:

count = get_error_count(i)

参考 Python 3.0有点像这样。可以绑定多余的值 (作为列表)到最后一个变量:

a,b,* c = [1,2,3,4,5]

将导致c包含[3,4,5]。

在Python 2.x中,你不能直接这样做,但你应该能够 创建一个延长或缩短参数输入元组的函数 到正确的长度,你可以这样做:

a,c,b = fix(1,2)
d,e,f = fix(1,2,3,4)

但是,该功能不知道左手边的长度 序列,所以它必须作为额外的参数或硬传递 编码。

所以

count = get_error_count(i)
uses only one variable, where as
def get_error_count(lookup, index):
takes on 2

我应该使用什么作为第二个变量?解决这个问题?

谢谢, -Kamal。

-------------------->>开始捕获stdout<< ---------------------

\     test_many_errors.test_assert_one ...失败     test_many_errors.test_one ......好的     test_many_errors.test_assert_two ...错误     test_many_errors.test_two ......好的     test_many_errors.test_value_one ...错误     test_many_errors.test_value_two ... SKIP :(,ValueError(),)     test_many_errors.test_good_one ......好的     test_many_errors.test_good_two ...好的

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/Current/bin/nosetests", line 10, in <module>
    sys.exit(run_exit())
  File "/Library/Frameworks/Python.framework/Versions/6.3/lib/python2.6/site-packages/nose/core.py", line 117, in __init__
    **extra_args)
  File "/Library/Frameworks/Python.framework/Versions/6.3/lib/python2.6/unittest.py", line 817, in __init__
    self.runTests()
  File "/Library/Frameworks/Python.framework/Versions/6.3/lib/python2.6/site-packages/nose/core.py", line 196, in runTests
    result = self.testRunner.run(self.test)
  File "/Library/Frameworks/Python.framework/Versions/6.3/lib/python2.6/site-packages/nose/core.py", line 63, in run
    result.printErrors()
  File "/NOSE_TRIM/nosetrim-read-only/nosetrim/nosetrim.py", line 136, in printErrors
    lambda i: get_error_count(self._error_lookup, i))
  File "/NOSE_TRIM/nosetrim-read-only/nosetrim/nosetrim.py", line 142, in printErrorList
    for test, err, capt in errors:
ValueError: need more than 2 values to unpack

/

---------------------&gt;&gt;结束捕获的stdout&lt;&lt; ----------------------


在1.263s中进行3次测试

4 个答案:

答案 0 :(得分:20)

而不是在作业中解压缩:

a, b, c = do_something()

尝试将结果分配给单个变量并测试其长度:

t = do_something()
# t is now a tuple (or list, or whatever was returned) of results
if len(t) > 2:
    # Can use the third result!
    c = t[2]

答案 1 :(得分:2)

所以errors是一个包含长度为2或3的元组的项的列表。您想要一种方法来解析for循环中不同长度的元组。正如您所指出的,在Python2中没有干净的方法可以做到这一点。我建议确保您的错误列表始终包含长度为3的元组,而不是提出一种实现此行为的聪明方法。这可以在每次向errors添加项目时执行,也可以在事实上,像这样:

errors = [(x[0], x[1], x[2]) if len(x) == 3 else (x[0], x[1], None) for x in errors]

或者你可以创建一个生成器(这违背了我没有找到聪明的方法来实现这种行为的建议):

def widen_tuples(iter, width, default=None):
    for item in iter:
        if len(item) < width:
            item = list(item)
            while len(item) < width:
                item.append(default)
            item = tuple(item)
        yield item

像这样使用:

>>> errors = [(1, 2), (1, 2, 3)] 
>>> for a, b, c in widen_tuples(errors, 3):
...     print a, b, c
1 2 None
1 2 3

答案 2 :(得分:1)

您可以编写一个实用程序函数来使结果统一:

def do_something2():
    return 1, 2

def do_something3():
    return 1, 2, 3

def do_something5():
    return 1, 2, 3, 4, 5

def uniform_result(*args):
    return args[0], args[1], args[2:]

a, b, c =  uniform_result(*do_something2())
print a, b, c
# 1 2 ()

a, b, c =  uniform_result(*do_something3())
print a, b, c
# 1 2 (3,)

a, b, c =  uniform_result(*do_something5())
print a, b, c
# 1 2 (3, 4, 5)

答案 3 :(得分:1)

我建议使用None元素将列表补充到必要的长度:

data = give_me_list()
(val1, val2, val3) = data + (3 - len(data)) * [None]

3是左侧值的数量。如果列表中包含过多的元素,则使用针对该元素的保护:

data = give_me_list()[:3]
(val1, val2, val3) = data + (3 - len(data)) * [None]