一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 兩個(gè)很實(shí)用的Python裝飾器詳解

兩個(gè)很實(shí)用的Python裝飾器詳解

2022-03-07 00:10Python探索牛 Python

這篇文章主要為大家介紹了Python的裝飾器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助,希望能夠給你帶來幫助

1.超時(shí)函數(shù)

這個(gè)函數(shù)的作用在于可以給任意可能會hang住的函數(shù)添加超時(shí)功能,這個(gè)功能在編寫外部API調(diào)用 、網(wǎng)絡(luò)爬蟲、數(shù)據(jù)庫查詢的時(shí)候特別有用

timeout裝飾器的代碼如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import signal,functools #下面會用到的兩個(gè)庫
class TimeoutError(Exception): pass #定義一個(gè)Exception,后面超時(shí)拋出
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

使用:

?
1
2
3
4
5
6
@timeout(5) #限定下面的slowfunc函數(shù)如果在5s內(nèi)不返回就強(qiáng)制拋TimeoutError Exception結(jié)束
def slowfunc(sleep_time):
  import time
  time.sleep(sleep_time) #這個(gè)函數(shù)就是休眠sleep_time秒
slowfunc(3) #sleep 3秒,正常返回 沒有異常
slowfunc(10) #被終止

## 輸出
---------------------------------------------------------------------------
TimeoutError Traceback (most recent call last)

2.Trace函數(shù)

有時(shí)候出于演示目的或者調(diào)試目的,我們需要程序運(yùn)行的時(shí)候打印出每一步的運(yùn)行順序 和調(diào)用邏輯。類似寫bash的時(shí)候的bash -x調(diào)試功能,然后Python解釋器并沒有 內(nèi)置這個(gè)時(shí)分有用的功能,那么我們就“自己動手,豐衣足食”。

Trace裝飾器的代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
'''
學(xué)習(xí)中遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流群:725638078
尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書!
'''
import sys,os,linecache
def trace(f):
  def globaltrace(frame, why, arg):
    if why == "call": 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

使用:

?
1
2
3
4
5
6
@trace
def xxx():
  print (1)
  print (22)
  print (333)
xxx() #調(diào)用

## 輸出
<ipython-input-4-da50741ac84e>(3): print 1 # @trace 的輸出
1
<ipython-input-4-da50741ac84e>(4): print 22 # @trace 的輸出
22
<ipython-input-4-da50741ac84e>(5): print 333 # @trace 的輸出
333

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注服務(wù)器之家的更多內(nèi)容!

原文鏈接:https://www.cnblogs.com/djdjdj123/p/15563756.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黄篇网站在线观看 | 国产精品久久久久影视不卡 | 91天堂在线视频 | 亚洲人成网站在线观看90影院 | 丝瓜秋葵番茄绿巨人在线观看 | 视频免费视频观看网站 | 精品一区二区三区五区六区七区 | 青青青青青国产免费手机看视频 | 欧美日韩视频在线一区二区 | 日本68xxxxxxxxx24| 青青久久久国产线免观 | 成人福利网站含羞草 | 好猛好紧好硬使劲好大刺激视频 | 沉沦艳妇杨幂肉体小说 | 美女视频ww8888网网 | 欧美高清免费一级在线 | 五月天国产精品 | 亚洲男人的天堂网 | 网站视频免费 | 国产精品视频第一区二区 | 国产青色| 韩日一区二区三区 | 欧美另类z0zxi | 国产精品一在线观看 | 国产小视频在线 | 91青青在线视频 | 特黄视频免费看 | 小柔的性放荡羞辱日记动漫 | 国产免费又粗又猛又爽视频国产 | 欧亚尺码专线欧洲s码wmy | 大妹子最新视频在线观看 | 九9热这里只有真品 | 美女脱了内裤让男桶爽 | 男人添女人 | 99久久久无码国产精品 | 3344在线看片 | 色综合网天天综合色中文男男 | 手机在线观看精品国产片 | 羞羞麻豆国产精品1区2区3区 | 2020韩国r级理论片在线观看 | 丝瓜草莓香蕉绿巨人幸福宝 |