Partial fonksiyonu, Python'un standart kütüphanesinde (functools modülü) Python 2.5 itibarıyla, karrarama kalıbını uygulamak ve bir fonksiyona argümanların kısmi uygulanmasını sağlamak için ortaya çıkmıştır. Partialmethod ise Python 3.4'te sınıf yöntemlerinde benzer bir kullanım için oluşturulmuştur.
Gerçek projelerde, bir fonksiyona bazı argümanların sabitlenip yeni bir fonksiyon elde edilmesi gerektiği durumu sıkça ortaya çıkar. Bu, geri çağırmalar (callbacks), argüman geçiş şablonları veya kodun okunabilirliğini artırmak için, özellikle fonksiyonel programlama ve belirli bir fonksiyon stilini bekleyen API'ler ile kullanıldığında faydalıdır.
Partial fonksiyonu, bazı argümanların ya da anahtar argümanların "katı" bir şekilde sabitlenmiş olduğu yeni bir fonksiyon nesnesi döner. Partialmethod, sınıf yöntemleri için aynı yaklaşımı benimser ve self/cls mekanizmasını doğru bir şekilde destekler.
Kod örneği:
from functools import partial, partialmethod def power(base, exponent): return base ** exponent # Üssü 2 olarak sabitliyoruz square = partial(power, exponent=2) print(square(5)) # 25 class Math: def power(self, base, exponent): return base ** exponent square = partialmethod(power, exponent=2) m = Math() print(m.square(5)) # 25
Anahtar özellikler:
Partial'ı sınıf yöntemleri için kullanarak, partialmethod'un bir benzerini elde edebilir miyiz?
Hayır, partial self/cls'yi düzgün bir şekilde işleyemez, sınıf yöntemine uygulanması beklenildiği gibi çalışmaz: self otomatik olarak yerleştirilmez.
class C: def m(self, x, y): return x + y wrong = partial(m, y=2) # Yanlış!
c.wrong(5) çağrıldığında TypeError ortaya çıkar, çünkü self otomatik olarak aktarılmayacaktır.
Partial ile oluşturulan nesne bir fonksiyon mudur?
Evet, partial'ın sonucu, çağrılabilir olan, ismi, dokümantasyonu vb. destekleyen bir nesnedir, ancak bu sıradan bir fonksiyon değildir, call protokolünü uygulayan partial sınıfının bir nesnesidir.
from functools import partial f = partial(pow, 2) print(type(f)) # <class 'functools.partial'>
Partial, bir fonksiyonun varsayılan argümanları ile çalışır mı?
Evet, partial, iç fonksiyondaki varsayılan değerleri "yazabilir"; partial'ye verilen argümanlar, fonksiyonun kendisindeki varsayılan değerlerin üzerinde önceliğe sahiptir. Ancak değerleri çoğaltmamaya dikkat etmek önemlidir, aksi takdirde hata alınır.
Bir geliştirici, sınıf yöntemi için partial yerine partialmethod uyguluyor:
class MyClass: def f(self, x, y): ... squared = partial(f, y=2) ... obj = MyClass() obj.squared(5) # TypeError: 1 gerekli pozisyonel argüman eksik: 'self'
Artılar:
Eksiler:
Bunun yerine partialmethod kullanılır:
from functools import partialmethod class MyClass: def f(self, x, y): return x + y squared = partialmethod(f, y=2) obj = MyClass() print(obj.squared(5)) # 7
Artılar:
Eksiler: