需求:
在某專案中,程式執行效率較差,為分析程式內哪些函式的執行開銷較大,我們實現了乙個 帶timeout引數的函式裝飾器,裝飾功能如下:
@warn_timeout(1.5)
def func(a,b):
...1、統計被裝飾函式的單次呼叫執行時間
2.時間大於引數timeout的,將此次函式呼叫記錄到log日誌中
3、執行時可修改timeout的值
思路:1、為包裹函式新增乙個函式,用來修改閉包中使用的自由變數
2、在python3中:使用nonlocal訪問巢狀作用域中的變數引用
**:
#coding:utf-8
import time
import logging
def warn_timeout(timeout):
def decorator(func):
_timeout = [timeout] # python2中的實現
def wrap(*args,**kwargs):
timeout = _timeout[0] # python2中的實現
t0 = time.time()
res = func(*args,**kwargs)
used = time.time() - t0
if used > timeout:
logging.warning('%s:%s > %s',func.__name__,used,timeout)
return res
def set_timeout(new_timeout):
# nonlocal timeout # python3中的實現
_timeout[0] = new_timeout # python2中的實現
wrap.set_timeout = set_timeout
return wrap
return decorator
import random
@warn_timeout(1.5)
def f(i):
print('in f [%s]' % i)
while random.randint(0,1):
time.sleep(0.6)
for i in range(30):
f(i)
f.set_timeout(1)
for i in range(30):
f(i)
Python屬性的修改(裝飾器)
一 property 將乙個方法 偽裝成乙個 屬性 class person def init self,name,hight,weight self.name name self.hight hight self.weight weight property defbmi self return ...
python裝飾器 如何使用函式裝飾器
問題舉例 有時候我們想為多個函式統一新增某種功能,比如計時統計 記錄日誌,快取運算結果等 我們並不想在每個函式內一一新增完全相同的 有什麼解決方案嗎?定義裝飾器函式,用它在原函式的基礎上生成乙個新增新功能的函式來代替原函式 def memo func cache def wrap args res ...
如何使用函式裝飾器?
需求 某些時候我們想為多個函式,統一新增某種功能,比如計時統計 日誌記錄 快取運算結果等等 我們不想在每個函式內一一新增完全相同的 有什麼好的解決方案?思路 定義裝飾器函式,用它來生成乙個在原函式基礎上新增了新功能的函式,替代原函式 def memo func cache def wrap args...