【发布时间】:2020-12-18 16:22:09
【问题描述】:
我开始了我的一个新项目,我想创建一个函数,我们将其命名为foo,它会记住之前对其进行的调用。
因此,例如,如果函数应该返回最后使用的参数,我们应该有这个:
print(foo(2), foo(7), foo('a'))
打印出来:
None 2 7
问题
我们如何创建一个装饰器函数,例如称为bar,它打印给定的参数,除非前一个函数调用与前一个函数调用相同,在这种情况下,该函数不打印任何内容并简单地返回 None。
我做了什么?
到目前为止,我已经能够创建函数的骨架,如下所示:
@bar
def printer(*args):
print(*args)
在 bar 函数中,我应该以某种方式检查上一个调用,但我不知道如何!我不想使用全局变量或其他东西,而只想使用该函数。我假设我需要为 bar 和 foo 函数使用闭包。你能告诉我如何实现它们吗?
注意 这就是这些调用应该发生的情况:
printer("a") # prints a
printer("a") # only returns None
printer("a") # only returns None
printer("b") # prints b
printer("a") # prints a
【问题讨论】:
-
在您的情况下应该进行打印的函数应该驻留在
bar装饰器函数中,并且它将是一个具有自己的内部函数的函数,该函数将使用参数调用输入函数已通过,然后您可以在bar形成的闭包中管理这些参数。请查看 decorator basics 了解装饰器的工作原理。
标签: python closures decorator wrapper python-decorators