Pythonの非常に便利な2つのデコレーターを解説
2022-01-02 13:06:05
1. タイムアウト関数
この関数の目的は、ハングアップする可能性のある関数にタイムアウト機能を追加することであり、特に外部APIコール、Webクローラ、データベースクエリを記述する際に有用である
タイムアウト・デコレーターのコードは次のとおりです。 :
import signal,functools #The following two libraries will be used
class TimeoutError(Exception): pass #Define an Exception to be thrown after a timeout
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) #Finalize the following slowfunc function to force a TimeoutError Exception if it does not return within 5s
def slowfunc(sleep_time):
import time
time.sleep(sleep_time) # this function is to sleep sleep_time seconds
slowfunc(3) #sleep 3 seconds, normal return no exceptions
slowfunc(10) #is terminated
## 出力
---------------------------------------------------------------------------
TimeoutError トレースバック (最新のコールバック)
2. トレース機能
デモやデバッグのために、プログラム実行時に各ステップのシーケンスや呼び出しロジックをプリントアウトする必要がある場合があります。これはbashを書くときのbash -xのデバッグ機能に似ていますが、Pythonインタプリタにはこの便利な機能は組み込まれていないので、自分で"することになります。
Traceデコレータのコードは以下の通りです。
'''
No one to answer your questions in learning? I created a Python learning exchange group: 725638078
Looking for like-minded partners to help each other, the group also has good video learning tutorials and PDF e-books!
'''
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
使用しています。
@trace
def xxx():
print (1)
print (22)
print (333)
xxx() # call
## 出力
/{br
1
22
333
概要
この記事はこれで終わりです。この記事があなたの助けになることを願っていますし、BinaryDevelopの他のコンテンツにもっと注目していただけることを願っています
関連
-
[解決済み】Python: ValueErrorです。反復処理と読み込みメソッドを混在させるとデータが失われる
-
[解決済み] pygame clock.tick() vs ゲームメインループのフレームレート
-
Pythonの生産性を向上させる5つのJupyter notebookプラグイン
-
[解決済み] ValueError: xとyは同じサイズでなければならない
-
[解決済み] Pythonで巨大な数の除算を管理する方法とは?
-
[解決済み] Pythonで16進文字列の全バイトのxorチェックサムを作成する
-
[解決済み] Python のプロットにおける上付き添え字
-
Python3 reports TypeError: '***' object is not iterable.
-
TypeError: 'str' オブジェクトは整数として解釈できません。
-
Watching live videos and playing with CSS animations on Jupyter is so cool!
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Tkinterでウィンドウを閉じる関数
-
[解決済み】Pytorch AssertionError: CUDAを有効にした状態でTorchがコンパイルされていない
-
[解決済み] キャッシュエントリーのデシリアライズに失敗し、エントリーを無視される
-
Debug Road-13: Python: pandas IndexError: single positional indexer is out-of-bounds
-
[解決済み] 文字列の中で部分文字列が最後に現れるインデックスを検索する
-
[解決済み] Pandasのtranspose()と.Tの違いについて
-
[解決済み] TypeError: 整数の引数を期待したが、画像をグレイスケールに変換するときに浮動小数点になった。
-
[解決済み] Pythonはショートカットに対応していますか?
-
[解決済み] zlib という名前のモジュールはありません。
-
Pythonの小さなエラー collectionsAttributeError: 'dict' オブジェクトに 'add' 属性がない。