Хорошо, поэтому сначала нужно решить пару вопросов.
1. Распаковка не работает с отдельными значениями, она пытается исчерпать итерируемое и распаковать все сразу.
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.Доходность останавливает выполнение везде, где встречается.
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
И последнее, но не менее важное: убедитесь, что вам действительно нужен выход, в том виде, в каком он есть, я подозреваю, что функция сложна для чтения и, возможно, заслуживает разбиения на более мелкие модули.Я настоятельно рекомендую еще раз взглянуть на код и, если возможно, рассмотреть возможность его дальнейшего расширения