Eğer işlevi çağırmak her zaman kontrol yapmak istiyorsanız Blckknght cevabı büyük, ancak bir kez okuyabileceğiniz ve hiçbir zaman değiştiremeyeceğiniz bir ayarınız varsa, dekore edilen fonksiyon çağrıldığında her zaman ayarı kontrol etmek istemeyebilirsiniz. Yüksek performanslı çalışmalarımızın bazılarında, python dosyası ilk kez yüklendiğinde bir ayar dosyasını kontrol eden bir dekoratör yazdım ve onu paketleyip göndermeyeceğine karar verdim. İşte
örnek
def timed(f):
def wrapper(*args, **kwargs):
start = datetime.datetime.utcnow()
return_value = f(*args, **kwargs)
end = datetime.datetime.utcnow()
duration = end - start
log_function_call(module=f.__module__, function=f.__name__, start=__start__, end=__end__, duration=duration.total_seconds())
if config.get('RUN_TIMED_FUNCTIONS'):
return wrapper
return f
o log_function_call varsayarsak bir veritabanı, kayıt dosyasına ya da her neyse ve bu config.get için çağrı kaydeder olduğu ('RUN_TIMED_FUNCTIONS') daha sonra @timed dekoratör ekleyerek, küresel yapılandırmasını denetler bir işleve, bu sunucuda, ortamda, vb. zamanlama olup olmadığınızı görmek için yüklendikten sonra bir kez kontrol edeceksiniz ve eğer değilse, bu, işlevin veya performansla ilgilendiğiniz diğer ortamların işlevini değiştirmeyecektir.
Teşekkürler! Yorum bölümü biçimlenmiyor, bu yüzden örnek kodu orijinal cevabınıza ekledim. Zamanlama fonksiyonunun neden çağrılmadığını açıklayabilir misiniz? – cfpete
Dekoratör içe aktarma zamanında uygulanır, bu nedenle örnek değişkenlere bu anda başvurulmaz. Bunun için farklı bir dekoratör yazmalısın. Bu Q ve yorum formatı için kapsam dışı. :-) –
Bunu, sınıf tabanlı yöntemlerde kullanmak istiyorum, Django Sınıfı temelli görünümler için nasıl kullanırdım. Orada 'method_decorator' kullanmak zorundayız. Bu kod nasıl uyumlu hale getirilir? – PythonEnthusiast