我已經開始了一個新項目,我想創建一個函數,我們將其命名為foo,它會記住之前對其進行的調用。因此,如果函數應該返回最后使用的參數,我們應該這樣:print(foo(2), foo(7), foo('a'))打印出:None 2 7問題我們如何創建一個裝飾器函數,例如調用bar它打印給定的參數,除非前一個函數調用與前一個相同,在這種情況下,該函數不打印任何內容,只是返回 None 。我設法做了什么?到目前為止,我已經能夠創建該函數的框架,如下所示:@bardef printer(*args): print(*args)在 bar 函數中,我應該以某種方式檢查之前的調用,但我不知道如何!我不想使用全局變量或其他東西,而只想使用函數。bar我假設我需要對and函數使用閉包foo。你能告訴我如何實施它們嗎?注意 ,這些調用應該發生以下情況:printer("a") # prints aprinter("a") # only returns None printer("a") # only returns Noneprinter("b") # prints bprinter("a") # prints a
1 回答

有只小跳蛙
TA貢獻1824條經驗 獲得超8個贊
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
添加回答
舉報
0/150
提交
取消