ProgramlamaBackend Geliştirici

Python'da pozisyonel ve anahtar (keyword) argümanlarla çalışmanın mekanizması nasıl çalışır? Fonksiyon tanımı ve çağrısındaki argümanların sırasına dair hangi incelikler vardır ve yalnızca pozisyonel ile yalnızca anahtar parametrelerin avantajları nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

Parametre Türleri

  1. Pozisyonel (genellikle ilk sıradadır): değerler belirtilen sıraya göre iletilir.
  2. Anahtar: açıkça isim verilerek belirtilir.
  3. Yalnızca pozisyonel: / sembolünden önce tanımlanır (Python 3.8+), isimle belirtilmesi mümkün değildir.
  4. Yalnızca anahtar: * 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

İncelikler

  • Parametrelerin sırası: (yalnız-pozisyonel) / (pozisyonel-veya-anahtar) * (yalnızca-anahtar)
  • Hatalı argüman sırası durumunda — SyntaxError veya TypeError.
  • *args ek pozisyonel toplar; **kwargs ise anahtarlıdır.

Altta yatan bir soru.

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?

Cevap:

  • 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.
  • Yalnızca pozisyonel olarak tanımlanmamışsa, parametreleri isimle belirtmek mümkündür.
  • def f(a, b, /, c): şeklinde tanımlanmışsa, a ve b yalnızca pozisyonel olarak belirtilmelidir.

Örnek:

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

Bilinçsizlikten kaynaklanan gerçek hata örnekleri


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.