ProgramlamaPython geliştirici

Python'daki *args ve **kwargs argümanlarının nasıl çalıştığını açıklayın. Ne amaçla kullanılırlar, yanlış kullanıldığında ne gibi tehlikeleri vardır ve bunları normal ve isimlendirilmiş argümanlarla nasıl doğru bir şekilde kombinlemek gerekir?

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

Cevap

*args — istenen sayıda konumsel argümanı bir demet içinde toplar.

**kwargs — istenen sayıda isimlendirilmiş argümanı (anahtar=değer) bir sözlük içinde toplar.

Bu, işlevleri esnek bir arayüzle yazmanıza olanak tanır:

def my_func(a, b, *args, **kwargs): print(a, b) print(args) print(kwargs) my_func(1, 2, 3, 4, x=10, y=20) # 1 2 # (3, 4) # {'x': 10, 'y': 20}

İnce noktalar:

  • Normal argümanlar önce gelir, ardından *args, ardından varsayılan değerli isimlendirilmiş argümanlar ve **kwargs — bu sıra, işlev tanımında kesinlikle izlenmelidir.
  • * ile dizileri "açabilir", ** ile fonksiyonu çağırırken sözlükleri açabilirsiniz.
  • Aynı parametreleri tekrar tanımlamak mümkün değildir — bu bir TypeError hatasına yol açar.

Kandırmaca sorusu

*args ve varsayılan değere sahip isimlendirilmiş argümanların sırasını değiştirmek mümkün mü, örneğin:

def foo(a, *args, x=10, **kwargs): pass

Yoksa her zaman varsayılan değerleri *args'den sonra mı yerleştirmek zorundayız?

Cevap:

Python 3'te mümkündür! İşte böyle (Python 2'de çalışmıyordu):

def foo(a, *args, x=10): pass

*args'den sonraki parametreler ("anahtar yalnızca argümanlar") varsayılan değer alabilir veya zorunlu olabilir — bunlar yalnızca isimle belirtilmelidir.

Gerçek hata örnekleri konunun inceliklerini bilmediğinizde


Hikaye

Yanlış argümanların *args/**kwargs yoluyla iletilmesi

REST API servislerinde veri marşalizasyonu otomasyonu **kwargs üzerinden inşa edildi. Fazladan bir parametre fark edilmedi — işlev, kwargs içinde beklenmedik bir değer aldı ve bu, kontrol mantığının kaybına ve zorlayıcı hata ayıklamalara yol açtı.


Hikaye

İsimlendirilmiş argümanların tekrarı

Geliştirici işlev çağrılmasında bir parametreyi hem açıkça hem de **kwargs üzerinden yanlışlıkla belirtti, örneğin: my_func(a=1, **{"a": 2}). Sonuç olarak — TypeError ve servis çökmesi.


Hikaye

Sadece konumsal veya isimlendirilmiş argümanları unuttular

Dekoratör yazarken, parametrelerin yanlış geçişi (sıra ve yapı ihlali) orijinal işlevin beklenmeyen bir argüman sayısı almasına yol açtı, bu, üretimde TypeError çağrı hatalarına yol açtı.