4

最近、Python デコレーターに関するこの記事を読んでいるときに、Python デコレーターのアプリケーションとしてメモ化の手法を例として挙げました。私は Python デコレータについて実際に理解していますが、デコレータのより効果的な使用例と、日常のコードでそれらを通常どのように使用するかを知りたいと思っています。

4

4 に答える 4

2

Python 3 は型注釈をサポートしているため、デコレータをチェックの方法として使用できます。

def check(f):
    def _f(x):
        if type(x) != f.__annotations__['x']:
            raise TypeError(type(x))
        val = f(x)
        if 'return' in f.__annotations__ and f.__annotations__['return'] != type(val):
            raise TypeError(type(val))
        return val
    return _f

@check
def f(x: int) -> int:
    return x * 2

>>> f(2)
4

>>> f('x')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in _f
TypeError: <class 'str'>
于 2012-04-12T12:27:46.377 に答える
2

、 、、などclassmethod、便利な組み込みデコレータが多数あります。デバッグ目的で関数の使用状況をログに記録するデコレーターを作成すると便利なことがよくあります。この Python wiki ページにはデコレータの例がたくさんありますが、少なくともこれらのいくつかは、実際に便利な機能を提供するよりも、Python がいかに柔軟であるかを示すことを目的としていると思います。propertystaticmethodfunctools.wrap

于 2012-04-12T12:18:32.587 に答える
0

これは実用的な例です。メモの有無にかかわらず、フィボナッチの級数和を見てみましょう。

from functools import wraps
def memo(func): 
    cache = {}
    @wraps(func)
    def wrap(*args):
        if args not in cache: 
            cache[args] = func(*args)
        return cache[args] 
    return wrap

def fib(i):
    if i < 2: return 1
    return fib(i-1) + fib(i-2)

@memo
def fib_memo(i):
    if i < 2: return 1
    return fib_memo(i-1) + fib_memo(i-2)

そして今、速度の違いをテストしてください!

>>> print fib(200)
...
>>> print fib_memo(200)
...
于 2012-04-12T12:17:25.017 に答える
0

Django Web フレームワークのauth ドキュメントで、Python デコレータの効果的な使用例を見ることができます。明確な例 (私が個人的に日常的に使用している) には、ビューを認証済みユーザー制限するためのデコレータの使用、特定のユーザー権限に応じてアクセスを制限するための使用などがあります。

于 2012-04-12T12:14:23.423 に答える