Python'da dekoratörler, 2.4 sürümünden itibaren dilin bir parçası haline geldi ve işlevlerin ve sınıfların davranışını değiştirme imkanı sağladı. İşlev parametreleri için dekoratörler, dilde doğrudan sözdizim desteği olmadığı için manuel olarak uygulanan daha karmaşık bir patterndir. Ancak, anotasyonlar ve metaprogramlama aracılığıyla işlevselliği uygulanabilir.
Standart dekoratörler, tüm işlevi veya yöntemi etkiler. Bazen, belirli bir soyutlama seviyesinde yalnızca belirli işlev parametrelerini doğrulamak, günlüğe kaydetmek veya değiştirmek gerekebilir. Örneğin, bir argümanın türünü kontrol etmek, parametrenin değerini dönüştürmek veya girdi sınırlamaları koymak.
İşlev parametre dekoratörleri, meta veriler (örneğin, tür anotasyonları aracılığıyla) olarak oluşturulur ve dış bir saran dekoratör tarafından işlenir. Patterndeki temel fikir, parametreler hakkında gereken bilgileri saklamak ve ardından "işlevsel" dekoratörün bu bilgiyi işlev çağrısı sırasında değerleri işlemek için kullanmasıdır.
Kod örneği:
import inspect from functools import wraps def positive_param(fn): """Argümanın pozitif olmasını zorunlu kılan bir not. """ fn._positive = True return fn # Dış kapsamlı tam dekoratör def validate_decorator(func): spec = inspect.getfullargspec(func) @wraps(func) def wrapper(*args, **kwargs): bound_args = inspect.signature(func).bind(*args, **kwargs) for name, value in bound_args.arguments.items(): param = func.__annotations__.get(name, None) if getattr(param, '_positive', False) and value <= 0: raise ValueError(f"Argüman {name} pozitif olmalıdır") return func(*args, **kwargs) return wrapper @validate_decorator def deposit(amount: positive_param): print(f"Yatırılan {amount}") deposit(10) # Tamam deposit(-5) # Değer Hatası
Anahtar özellikler:
Parametre dekoratörleri standart fonksiyon dekoratörlerinden nasıl farklıdır?
Standart dekoratör tüm işlevi sarar, parametrelerden bağımsızdır. Parametre dekoratörü, belirli bir argüman üzerine yoğunlaşır ve yalnızca ona uygulanır; bu da özel işleme ve imza analizi teknikleri gerektirir.
Python'da, TypeScript veya C#'da olduğu gibi, dekoratörlerin @ sözdizimini kullanarak parametrelerde uygulanabilir mi?
Hayır, Python'da @ ile dekoratör sözdizimi yalnızca işlevler ve sınıflar için uygulanır, ancak işlev parametreleri için değildir. Parametreler için anotasyonlar kullanılır ve ardından işlevi sarmak için anotasyonların işlenmesi gerekir.
Parametre dekoratörleri, açık bir anotasyon olmadan otomatik olarak fonksiyon argümanlarının parametrelerine uygulanabilir mi?
Hayır, Python, parametreler için dekoratörleri otomatik olarak uygulamaz, ancak işlevin imzasını analiz edecek ve çağrı sırasında parametre değerlerini değiştirecek bir özel dekoratör fabrikası ile kendi mekanizmanızı uygulayabilirsiniz.
Geliştirici, diğer dillerde olduğu gibi parametre üzerinde @ kullanabileceğinden emin ve şu şekilde yazar:
def f(@validate_positive x): ...
Artılar:
Eksiler:
Geliştirici, yukarıdaki örnekte olduğu gibi anotasyon ve dış dekoratör kullanır ve parametreleri imza ve anotasyonlar aracılığıyla işler:
Artılar:
Eksiler: