У меня есть функция my_algorithm
следующего вида:
- итеративно генерирует некоторые элементы
- вызывать реферат
inner_fn
по каждому пункту
def my_algorithm(*args, inner_fn, **kwargs):
for ...: # many nested loops go here
inner_fn(next_item) # call monitor on each item
Следовательно, my_algorithm
представляет «внешний алгоритм», внутреннее поведение которого параметризовано в inner_fn
.
Альтернативным способом абстрагирования внутреннего поведения было бы использование генератора:
def my_algorithm_iter(*args, **kwargs):
for ...: # many nested loops go here
yield next_item
Обе концепции предоставляют разные пользовательские интерфейсы, то есть
my_algorithm(*a, my_inner_fn, **kw)
против
for item in my_algorithm_iter(*a, **kw):
my_inner_fn(item)
Чтобы предложить оба интерфейса без дублирования кода, можно определить my_algorithm
с помощью my_algorithm_iter
следующим образом:
def my_algorithm(*agrs, inner_fn, **kwargs):
for item in my_algorithm_iter(*args, **kwargs):
inner_fn(item)
Мне было интересно, есть ли также простое решение для обратного, выражающее my_algorithm_iter
с помощью my_algorithm
.