Python'da bir fonksiyona dört tür parametre tanımlanabilir: pozisyonel, anahtar (keyword), yalnızca pozisyonel (positional-only) ve yalnızca anahtar (keyword-only). Bunun farklılığı, fonksiyon çağrıldığında değerlerin iletim şeklini etkiler.
/ sembolünden önce tanımlanır (Python 3.8+), isimle belirtilmesi mümkün değildir.* sonrasında tanımlanır, yalnızca anahtar ile belirtilmesi mümkündür.# Tüm türlerin örneği def func(a, b, /, c, *, d, e): print(a, b, c, d, e) func(1, 2, 3, d=4, e=5) # Tamam # func(a=1, b=2, 3, d=4, e=5) # Hata: a, b - yalnızca pozisyonel
SyntaxError veya TypeError.*args ek pozisyonel toplar; **kwargs ise anahtarlıdır.Fonksiyon tanımları arasındaki fark nedir:
def f(a, b, c): ... def f(a, b, c=1): ... def f(a, b=1, c=2): ... def f(a=1, b=2, c=3): ...
ve gerçekten de tüm bu fonksiyonlar hem pozisyonel hem de anahtar parametrelerle çağrılabilir mi?
def f(a, b, c): fonksiyonu yalnızca anahtar argümanlarla çağrılamaz, çünkü tümü pozisyonel ya da anahtar ile geçilebilir, fakat tüm argümanlar zorunludur.def f(a, b, /, c): şeklinde tanımlanmışsa, a ve b yalnızca pozisyonel olarak belirtilmelidir.def f(a, b, c=10): print(a, b, c) f(1, 2) # Tamam, c=10 varsayılan f(a=1, b=2, c=3) # Tamam # Ama: def f(a, b, /, c=10): ... f(1, 2) # Tamam f(a=1, b=2, c=3) # Hata! a ve b yalnızca pozisyonel
Hikaye
Geliştirici, yalnızca anahtar ile parametre alması gereken bir fonksiyon tasarladı: birçok parametreli loglama, bazıları isteğe bağlı. Ama * sembolünü unuttu — kullanıcılar yanlışlıkla pozisyonel sırada parametreler gönderdi, bu da yanlış loglamalara ve takip edilmesi zor hatalara yol açtı.
Hikaye
REST API projesinde, argüman sırasıyla ilgili açık bir anlaşma olmaması nedeniyle (kullanım *args ve isimle sınırlama olmaması) yeni istemci sürümü entegre edildikten sonra istekler çalışmamaya başladı — çünkü args kaydı kaydı kaydırdılar. Belirgin * ekleyerek ve yalnızca anahtar parametreleri belirterek bunu düzelttik.
Hikaye
Büyük bir kurumsal projede, varsayılan değerleri olan yeni parametrelerle bir fonksiyon genişletildi, ancak pozisyonel değerlerle hatalı çağrı yapılması nedeniyle eski kod başka parametrelere değer atamaya başladı, bu da veri işleme hatalarına neden oldu. Parametrelerin yalnızca anahtar olarak olacağı kesinleşti.