def once(fcn):
func = [fcn]
def inner(*args):
return func.pop()(*args) if len(func) else None
return inner
def add(a,b):
return a+b
oneAddition = once(add)
print(oneAddition(2,2)) # 4
print(oneAddition(2,2)) # None
print(oneAddition(12,200)) # None
print(once(add)(2,2)) # 4
print(once(add)(2,2)) # Should return None, returns 4
print(once(add)(12,200)) # Should return None, returns 212
Итак, цель этой вложенной функции - отслеживать, сколько раз был вызван внешний.Он возвращает результат добавления только при первом вызове.После этого, когда бы он ни вызывался, он возвращает None.
Что меня действительно заинтересовало, так это то, что oneAddition = Once (добавить) -> OneAddition (2,2) и Once (Add) (x, y) ведут себя по-разному.
Во втором методе кажется, что внешняя функция также выполняется.В первом методе внешняя функция выполняется только при создании (во многом как декораторы).
Может кто-нибудь объяснить мне, почему это так?Большое спасибо.
PS Я знаю, что использование нелокальных переменных было бы гораздо более подходящим решением, я просто включил подход function-in-a-list , потому что он выглядит довольно круто (найденоэто онлайн).