Я пытаюсь создать метод, который также действует как функция генератора, при переключении переключателя (want_gen
ниже).
Что-то вроде:
def optimize(x, want_gen):
# ... declaration and validation code
for i in range(100):
# estimate foo, bar, baz
# ... some code here
x = calculate_next_x(x, foo, bar, baz)
if want_gen:
yield x
if not want_gen:
return x
Но, конечно, это не работает - Python, по-видимому, не допускает yield
и return
в одном методе, даже если они не могут быть выполнены одновременно.
Код довольно сложен, и рефакторинг объявления и кода проверки не имеет большого смысла (слишком много переменных состояния - я в итоге получу трудные для имени подпрограммы-помощники из 7+ параметров, которыерешительно некрасиво).И, конечно же, я бы хотел как можно больше избегать дублирования кода.
Есть ли здесь какой-нибудь шаблон кода, который имел бы смысл для достижения желаемого поведения?
Почемумне это нужно?
У меня довольно сложная и трудоемкая процедура оптимизации, и я хотел бы получить отзыв о ее текущем состоянии во время выполнения (для отображения, например, в графическом интерфейсе).Старое поведение должно быть там для обратной совместимости.Многопоточность и обмен сообщениями - это слишком много работы для слишком небольшого дополнительного преимущества, особенно когда необходима кроссплатформенная работа.
Редактировать: Возможно, я должен был упомянуть, что каждый шаг оптимизации довольно длительный (также есть некоторые численные симуляции), я хотел бы иметь возможность «вмешаться» на определенной итерации и изменить некоторые параметры, или отменить весь бизнес в целом.Генераторы казались хорошей идеей, так как я мог запустить другую итерацию по своему усмотрению, в то же время возиться с некоторыми параметрами.