*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:
*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.
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ı.