Как выразить функцию генератора через функцию шаблона в python - PullRequest
0 голосов
/ 01 июня 2019

У меня есть функция 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.

...