我收到错误: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次测试
答案 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]