包装一个FOR函数

时间:2019-02-01 07:08:35

标签: python wrapper

专门用于for-loop及其操作的python包装器

我写了很多很普通的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 :(得分:1)

为什么要使其复杂?

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

答案 1 :(得分:1)

您可以简单地将代码重构为不要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")

答案 2 :(得分:0)

立即评估打印结果并传递其返回值。您要在此处传递可调用对象,并将()附加到循环内的do_something中。您可以将lambda用作传入的函数。

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)