Pythonデコレータの物語

画像



複雑よりも単純な方が優れています。

デコレータについてはすでに聞いたことがあるが、なぜ必要なのか、プロジェクトでどのように使用するのかがわからない方のための資料。



デコレータは、コードを直接変更せずに別の関数をラップして機能を拡張できる関数であることを思い出してください。詳細については、たとえばここをご覧ください。



はじめましょう。



昔、大規模で居心地の良いプロジェクトでは、この機能は機能していましたfetch_webpage



import requests

def fetch_webpage():
    webpage = requests.get('https://google.com')
    return webpage

fetch_webpage()


でる:



<Response [200]>


それからマネージャーが来て、それがどれだけ機能するか、この機能を測定したかった、 夜遅くですか. . :



import time 
import requests

def fetch_webpage():
    start = time.time()
    webpage = requests.get('https://google.com')
    end = time.time()
    print(' : {} .'.format(end-start))
    return webpage

fetch_webpage()


Out:



 : 0.1602182388305664 .
<Response [200]>


KPI.

, , , , .

wrapper, , func . :



import time 
import requests

def wrapper(func):
    start = time.time()
    out = func()
    end = time.time()
    print(' : {} .'.format(end-start))
    return out

def fetch_webpage():
    webpage = requests.get('https://google.com')
    return webpage

wrapper(fetch_webpage)


Out:



 : 0.1602182388305664 .
<Response [200]>


オレグは喜んで、大規模で居心地の良いプロジェクトのコード全体を書き直したいと思っていましたが、すぐに変更を加えることに飽きて悲しくなりました。

オレグは3スプリントと3日間を考え、デコレーターを思い出し、再びとても幸せでした。これは、デコレータを使用してこの問題を解決する方法です。



import time 
import requests

def benchmark(func):
    def wrapper():
        start = time.time()
        out = func()
        end = time.time()
        print(' : {} .'.format(end-start))
        return out
    return wrapper

@benchmark
def fetch_webpage():
    webpage = requests.get('https://google.com')
    return webpage

fetch_webpage()


でる:



 : 0.15940594673156738 .
<Response [200]>


ここで、すべてのマネージャーは喜んで、お互いを祝福し始めました。これで、すべての機能が 飼いならされた、野生ではない 測定可能で、オレグはメダルや命令さえ与えられました、私は正確に覚えていません。




All Articles