24739


python初心者です。  
デコレーターがどういうものなのか、どういった時に必要となるのかが理解できません。  
例とともに教えていただけたら幸いです。


CC BY-SA 3.0
2016-05-11T02:00:29.807
24732
2016-05-11T04:53:17.040
10111
question
python
pythonでのデコレーターに関して


例えば標準ライブラリに functools.lru_cache というデコレータがあります。

このデコレータは、たとえば自分で作成した関数が実行にある程度長い時間がかかる(1秒程度)けれども、関数の引数に対して返値がずっと変わらない、あるいは一定期間変わらない場合に使用します。

[code]

    def get_first_image(url):
        """与えられたURLのページを開いて、HTML内からリンクされている一番大きな画像データを返す"""
        # ここに実装
        return image_data
    
[/code]

こんな関数を実装した場合実行に2,3秒くらいかかるかもしれません。もしこの関数に同じURLを何度も指定する可能性があるなら、URLに対する結果をキャッシュしておけば2回目以降の実行は速く返せるはずです。

そこで、以下のように書きます。

[code]

    from functools import lru_cache
    
    @lru_cache()
    def get_first_image(url):
        """与えられたURLのページを開いて、HTML内からリンクされている一番大きな画像データを返す"""
        # ここに実装
        return image_data
    
[/code]

これでキャッシュされるようになりました。

decoratorを使えば関数の呼び出しに対して処理を付加できます。今回の例では、get_first_imageという関数にキャッシュ機能を付加しました。デコレータは、対象関数の呼び出しに対する結果を変えないのが原則です。デコレータを使えば関数の返値を書き換えたりもできてしまいますが、利用者はそのようは副作用があると混乱するので、やらないほうがよいでしょう。


CC BY-SA 3.0
2016-05-11T04:53:17.040
24739
2016-05-11T04:53:17.040
806
24732
answer