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

问题描述

我已经开始了我的一个新项目,我想创建一个函数,我们将其命名为foo,它会记住以前对该函数调用

因此,例如,如果函数应返回使用的最后一个参数,则应具有以下参数:

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

打印出:

None 2 7

问题

我们如何创建一个装饰器函数,例如称为bar,它会打印给定的参数,除非上一个函数调用与上一个函数调用相同,在这种情况下,该函数不打印任何内容并仅返回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(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(3))
1 2 None 3