兩個很實用的Python裝飾器詳解

2022-09-24 10:48:12 字數 2330 閱讀 7779

目錄

這個函式的作用在於可以給任意可能會hang住的函式新增超時功能,這個功能在編寫外部api呼叫 、網路爬蟲、資料庫查詢的時候特別有用

timeout裝飾器的**如下:

import signal,functools #下面會用到的兩個庫

class timeouterror(exception): pass #定義乙個exception,後面超時丟擲

def timeout(seconds, error_message = 'function call timed out'):

def decorated(func):

def _handle_timeout(signum, frame):

raise timeouterror(error_message)

def wrapper(*args, **kwargs):

signal.signal(signal.sigalrm, _handle_timeout)

signal.alarm(seconds)

try:

result = func(*args, **kwargs)

finally:

signal.alarm(0)

return result

return functools.wraps(func)(wrapper)

return decorated

使用:@timeout(5) #限定下面的slowfunc函式如果在5s內不返回就強制拋timeouterror exception結束

def slowfunc(sleep_time):

import time

time.sleep(sleep_time) #這個函式就是休眠sleep_time秒

slowfunc(3) #sleep 3秒,正常返回 沒有異常

slowfunc(10) #被終止

www.cppcns.com## 輸出

---------------------------------------------

timeouterror traceback (most recent call last)

有時候出於演示目的或者除錯目的,我們需要程式執行的時候列印出每一步的執行順序 和呼叫邏輯。類似寫bash的時候的bash -x除錯功能,然後python直譯器並沒有 內建這個時分有用的功能,那麼我們就「自己動手,豐衣足食」。

trace裝飾器的**如下:

'''學習中遇到問題沒人解答?小編建立了乙個python學習***:725638078

尋找有志同道合的小夥伴,互幫互助,群裡還有不錯的**學習教程和pdf電子書!

'''import sys,os,linecache

def trace(f):

def globaltrace(frame, why, arg):

if why == "ca程式設計客棧ll": return localtrace

return none

def localtrace(frame, why, arg):

if why == "line":

# record the file name and line number of every trace

filename = frame.f_code.co_filename

lineno = frame.f_lineno

bname = os.path.basename(filename)

print("{}({}): {}".format( bname,

lineno,

linecache.getline(filename, lineno).strip('\r\n')),)

return localtrace

def _f(*args, **kwds):

sys.settrace(globaltrace)

result = f(*args, **kwds)

sys.settrace(none)

return result

return _f

使用:@trace

def ***():

print (1)

print (22)

print (333)

***() #呼叫

## 輸出

(3): print 1 # @trace 的輸出

1(4): print 22 # @trace 的輸出

22(5): p程式設計客棧rint 333 # @trace 的輸出

333本文標題: 兩個很實用的python裝飾器詳解

本文位址: /jiaoben/python/440231.html

python兩個裝飾器的運算順序

裝飾順序按靠近函式順序執行,呼叫時由外而內,執行順序和裝飾順序相反。def makebold func def wrap return func return wrap def makeitalic func def wrap return func return wrap makebold mak...

兩個裝飾器的執行順序

如下,兩個裝飾器time func 和auth func分別實現了測試程式耗時和認證功能 import time user name zb user pwd 123 def time func func1 print time def inner1 print from inner1 start t...

python裝飾器的簡單實用

裝飾器 decorators 可以實現在不變原有python 功能的基礎上增加功能 框架def outer2 func def inner args,kwargs func args,kwargs return inner outer2 def foo a,b,c print a b c 示例一 i...