最近在研究 python 修饰函数,虚心请教如下问题。废话不说,先上代码:
import time
from datetime import datetime
from datetime import timedelta
def time_func(time_interval, default=None):
def decorator(func):
func.__last_run = datetime.min
def guard(*args, **kwargs):
now = datetime.now()
if now - func.__last_run >= time_interval:
func.__last_run = now
return func(*args, **kwargs)
elif default is not None:
return default(*args, **kwargs)
return guard
return decorator
if __name__ == "__main__":
@time_func(timedelta(seconds=4),None)
def add():
print('test')
add()
add()
执行结果: 只显示一个'test'
问题: 这个代码实现了在规定时间内( time_interval )限制了函数 add ()的运行次数,只让它运行一次,其余忽略。 请问此代码中为何在执行第二遍 add()的时候跳过了开头的 func.__last_run = datetime.min 而直接进入 guard 中的代码?该怎样理它的解运作原理? Python 新手,十分感谢!
1
baichi 2018-07-03 03:20:05 +08:00
|
2
baichi 2018-07-03 03:21:14 +08:00 1
|
3
billgreen1 2018-07-03 09:49:25 +08:00 1
这么说吧,你不要调用 add(), 直接在 ipython 里面输入 add, 你会看到 add 其实不是 add 了,而是
<function __main__.time_func.<locals>.decorator.<locals>.guard(*args, **kwargs)>, 其实是 guard,但是这个 guard 绑定了一个它的外部变量,__last_run |