如何實現屬性可修改的函式裝飾器?

2022-06-22 11:57:10 字數 1233 閱讀 9477

需求:

在某專案中,程式執行效率較差,為分析程式內哪些函式的執行開銷較大,我們實現了乙個 帶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...