好吧,那么先解决几个问题。
1。解包对单个值不起作用,它试图用尽iterable并立即解包所有内容。
def func():
# ..do something...
yield 1, 2
yield 3
yield 4
a, b = func() #ValueError: too many values to unpack (expected 2)
a, b, c, d = func() #ValueError: not enough values to unpack (expected 4, got 3)
a, b, c = func() #Works
print(a) # (1,2)
2.yield在遇到时停止执行。
def func():
yield 1, 2
raise Exception
func_gen = func()
print(func_gen) #<generator object func at 0x000000ACB5A5EBF8>
val1, val2 = next(func_gen) #assigns values
next(func_gen) #raises exception only on next pass
3.必须做出妥协(这应该能回答你的要求)
func_gen = func()
print(func_gen) #<generator object func at 0x000000ACB5A5EBF8>
for _ in func_gen:
res = _
#raises Exception but res = (1, 2)
4.一个建议(请不要使用异常,这确实是一项针对if条件的工作)
def func():
var1 = 0
var2 = 1
flag = not var1 > var2
yield var1, var2, flag #just add a flag during yield
#instead of your exception
# if not var1 > var2:
# raise Exception(var1,var2)
#stuff
yield 'something else'
func_gen = func()
print(func_gen) #<generator object func at 0x000000ACB5A5EBF8>
for _ in func_gen:
res = _
*values, flag = res
if flag:
break
var1,var2 = values #0, 1
-
最后但并非最不重要的是,确保你真的需要收益率,就目前的情况来看,我怀疑这个函数既难以阅读,也可能值得拆分成更小的模块。我强烈建议您再看一眼代码,如果可能的话,可以考虑进一步破坏它。