Обёртывание функции FOR - PullRequest
       14

Обёртывание функции FOR

0 голосов
/ 01 февраля 2019

Оболочка Python специально для for-loop s и ее действий

Я пишу много циклов FOR, которые, ну, в общем, довольно общие.

Например:

for x in y:
    do something

... и подвержен ошибкам.например, забыв про ":" или пробники отступа.

Можем ли мы поместить цикл FOR в def и вызвать его, снабжая его чем-то?Интересное упражнение, если ничего другого.

Базовая оболочка ...

def wrapper(func,*args):
    def wrapped():
        return func(*args)
    return wrapped
wrapper(print,"bob")
wrapper()

...which works. ie prints bob out

, но я не знаю, как заставить работать нижеприведенное - возвращение функции FOR приводило к множеству синтаксических ошибок.

например, что-то вроде:

def for_1(y, do_something):
    def wrapped():
        return for x in y:
                  do_something
    return wrapped
for_1(range(3),print("bob\n"))
for_1()

... и не видел Боба на экране 3 раза.

Может кто-нибудь направить меня в правильном направлении,пожалуйста?Оболочка не выполняет возвращенную функцию.Возможно, использовать класс для оболочки?Тогда есть мои собственные методы (??) ... или, может быть, указать мне на страницу кого-то, кто делал это раньше.Я исследовал оболочки и декораторы, но не видел что-то для передачи параметров в функцию цикла FOR

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

печать вычисляется немедленно, и ее возвращаемое значение передается внутрь. Здесь вы хотите передать вызываемый объект и добавить add () в do_something внутри цикла.чем вы можете использовать лямбда для переданной функции.

def for_1(y, do_something):
    def wrapped():
        return for x in y:
                  do_something() # so we call whatever is passed in to be executed at this point
    return wrapped
f = for_1(range(3),lambda: print("bob\n"))
f()
# or equivalent:
def print_bob():
     print("bob\n")
for_1(range(3),print_bob)
0 голосов
/ 01 февраля 2019

Вы можете просто реструктурировать свой код, чтобы не return слишком рано и не вызывать рано.

Для этого разделите функцию и параметры как два параметра в вашей обертке for_1.Если вы хотите вернуть значение, соберите их в цикле for и верните в виде списка.

def for_1(y, do_something, with_param):
    for x in y:
        do_something(with_param)     

for_1(range(3), print, "bob")
0 голосов
/ 01 февраля 2019

Зачем усложнять?

def for_1(y, to_print):
    for x in range(y):
      print(to_print)

for_1(3, "bob")

ВЫХОД:

bob
bob
bob

РЕДАКТИРОВАТЬ:

def square(x):
    print(x*x)


def for_1(y, command, param):
    for x in range(y):
      command(param)

for_1(1, square, 3)

ВЫХОД:

9
...