使用闭包来记住以前的函数调用

using closures to remember previous function calls

我开始了我的一个新项目,我想创建一个函数,我们将其命名为 foo,它会记住之前对其进行的调用。

因此,例如,如果函数应该 return 最后使用的参数,我们应该这样:

print(foo(2), foo(7), foo('a'))

打印出来:

None 2 7

问题

我们如何创建一个修饰函数,例如 bar,它打印给定的参数,除非前一个函数调用与前一个函数调用相同,在这种情况下,该函数不打印任何内容,只是 returns None.

我做了什么?

到目前为止,我已经能够创建函数的骨架,如下所示:

@bar
def printer(*args):
    print(*args)

并且在 bar 函数中我应该以某种方式检查之前的调用,但我不知道如何!我不想使用全局变量或其他东西,而只使用函数。我假设我需要为 barfoo 函数使用闭包。你能告诉我如何实现它们吗?

注意 这些调用应该是这样的:

printer("a")  # prints a
printer("a")  # only returns None 
printer("a")  # only returns None
printer("b")  # prints b
printer("a")  # prints a

先写一个foo你想让你的装饰器产生的版本,例如

def foo(arg, prev=[]):
    if arg in prev[-1:]:
        return None
    else:
        prev.append(arg)
        return arg

>>> print(foo(1), foo(2), foo(2), foo(3))
1 2 None 3

现在你知道你想要装饰器做什么了。

def bar(f):
    def bar(arg, prev=[]):
        if arg in prev[-1:]:
            return None
        else:
            prev.append(arg)
            return(f(arg))
    return bar

现在重新定义 foo 没有内存,但包装在装饰器中:

@bar
def foo(arg):
    return arg

>>> print(foo(1), foo(2), foo(2), foo(3))
1 2 None 3