如何解决使用闭包来记住以前的函数调用
我已经开始了我的一个新项目,我想创建一个函数,我们将其命名为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
解决方法
例如,首先编写一个您希望装饰器生成的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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。