ホームページ >バックエンド開発 >Python チュートリアル >Python デコレーター - 関数呼び出しの数を制限するメソッド (10 秒に 1 回呼び出し)

Python デコレーター - 関数呼び出しの数を制限するメソッド (10 秒に 1 回呼び出し)

不言
不言オリジナル
2018-04-21 14:34:592459ブラウズ

以下は Python デコレーター - 関数の呼び出し回数を制限する方法 (10 秒に 1 回の呼び出し) です。これは良い参考値です。皆さんの参考になれば幸いです。ぜひ一緒に見てください

これは、大企業のブロガーからの最近の面接の質問です。10 秒ごとに呼び出される関数を制限するデコレーターを作成します。その時は筆記試験だったので、大まかなコードしか書かず、帰ってからPythonデコレータの基礎知識を復習してコードを書き終えました。それを記録するためにブログを書くことにしました。

デコレータは、パラメータを持つデコレータとパラメータのないデコレータに分けられます。

パラメータなしで装飾するときに注意する必要があるいくつかの詳細

1. デコレータ関数(デコレータ)自体についてしたがって、デコレータは通常2つの関数に対応します。デコレータ関数は、いくつかの初期化操作を実行するために使用されます。1 つは、装飾された関数 func の追加処理を実装するために使用される、decorator_func です。そして、func への参照を保持するために、decorator_func は通常、デコレータの内部関数として使用されます

#不带参数的装饰器
@dec1
@dec2
def func():
  ...
#这个函数声明等价于
func = dec1(dec2(func))
#带参数的装饰器
@dec(some_args)
def func():
  ...
#这个函数声明等价于
func = dec(some_args)(func)

デコレータ関数は、関数が宣言されるときに一度だけ呼び出されます

デコレータは実際には構文シュガーであり、関数が宣言された後に呼び出され、decorated_func が生成され、func シンボルへの参照が Decored_func に置き換えられます。その後、 func 関数が呼び出されるたびに、decorated_func が実際に呼び出されます (これは非常に重要です。装飾後は、実際には、decorated_func が毎回呼び出されます)。

def decorator(func):
  def decorator_func()
    func()
  return decorated_func

返されるdecorated_funcの関数名がfuncの関数名と同じであることを確認したい場合は、デコレーター関数がdecorator_funcを返す前に、decorated_func.name = func.nameを追加する必要があります。 functools モジュールは、このアクションを完了できるラップ デコレータを提供します。

>>> def decorator(func):
...   def decorated_func():
...     func(1)
...   return decorated_func
... 
#声明时就被调用
>>> @decorator
... def func(x):
...   print x
... 
decorator being called 
#使用func()函数实际上使用的是decorated_func函数
>>> func()
1
>>> func.__name__
'decorated_func'

デコレータ関数のローカル変数の素敵な使い方クロージャの特性上(クロージャ部分の詳細は(1)を参照)、デコレータで宣言した変数はデコレータ メソッドの終了後、デコレータ メソッドのローカル変数は再利用されないため、デコレータ メソッドのローカル変数をカウンタやキャッシュなどとして使用できます。

変数の値を変更したい場合、その変数は可変オブジェクトでなければならないため、カウンターであってもリストを使用して実装する必要があることに注意してください。そして、関数がデコレーター関数を 1 回呼び出すことを宣言し、異なる関数のカウンターが互いに競合しないようにします。たとえば、次のようになります。何気なくテストしてみましたが、基本的には問題ありません。

#@wraps(func)的操作相当于
#在return decorated_func之前,执行
#decorated_func.__name__ = func.__name__
#func作为装饰器参数传入, 
#decorated_func则作为wraps返回的函数的参数传入
>>> def decorator(func):
...   @wraps(func)
...   def decorated_func():
...     func(1)
...   return decorated_func
... 
#声明时就被调用
>>> @decorator
... def func(x):
...   print x
... 
decorator being called 
#使用func()函数实际上使用的是decorated_func函数
>>> func()
1
>>> func.__name__
'func'

関連する推奨事項:

Python で関数呼び出しの数を制限する

以上がPython デコレーター - 関数呼び出しの数を制限するメソッド (10 秒に 1 回呼び出し)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。