**kwarg Kullanımı
Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 43 / 64.
**kwargs, "keyword arguments" (anahtar kelime argümanları) ifadesinin kısaltmasıdır. Bir fonksiyonun, hepsini önceden tanımlamaya gerek kalmadan herhangi bir sayıda isimlendirilmiş argümanı (key=value çiftleri gibi) kabul etmesine olanak tanır.
Nasıl çalışır:
*args→ ekstra konumsal argümanları bir demet (tuple) içinde toplar**kwargs→ ekstra anahtar kelime argümanlarını bir sözlük (dictionary) içinde toplar
Basit Örnek
Mümkün olan en basit örnekle başlayalım:
def greet(**kwargs):
print(kwargs)
greet(name="Alice", age=25, country="Australia")Çıktı:
{'name': 'Alice', 'age': 25, 'country': 'Australia'}Gördüğünüz gibi, **kwargs tüm anahtar kelime argümanlarını otomatik olarak bir sözlükte toplar.
Sözlük Kullanımı
kwargs zaten bir sözlük olduğu için, üzerinde doğrudan döngü kurabilirsiniz:
def print_info(**kwargs):
print("Information received:")
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Bob", age=30, job="Teacher")Çıktı:
Information received:
name: Bob
age: 30
job: TeacherNormal Parametreleri **kwargs ile Birlikte Kullanma
Normal parametreleri **kwargs ile birleştirebilirsiniz:
def create_profile(name, **details):
print(f"Creating profile for: {name}")
print("Additional details:")
for key, value in details.items():
print(f" {key}: {value}")
create_profile("Sarah", age=28, city="London", hobby="Reading")Çıktı:
Creating profile for: Sarah
Additional details:
age: 28
city: London
hobby: ReadingBoş **kwargs
Eğer hiçbir anahtar kelime argümanı iletilmezse, kwargs boş bir sözlük olacaktır:
def show_data(**kwargs):
if kwargs:
print("Data:", kwargs)
else:
print("No data provided")
show_data() # Argüman yok
show_data(item="apple") # Argümanlarla birlikteÇıktı:
No data provided
Data: {'item': 'apple'}Gerçek Dünya Örneği: **kwargs ile Sınıf
İşte bir sınıfta **kwargs kullanımına bir örnek:
class Person:
def __init__(self, name, **kwargs):
self.name = name
self.details = kwargs
def show_info(self):
print(f"Name: {self.name}")
for key, value in self.details.items():
print(f"{key}: {value}")
person = Person("Alice", age=25, city="New York", job="Engineer")
person.show_info()Çıktı:
Name: Alice
age: 25
city: New York
job: EngineerSözlükleri Paketinden Çıkarma
Fonksiyonları çağırırken sözlükleri de açabilirsiniz (unpack):
def display_settings(**kwargs):
for setting, value in kwargs.items():
print(f"{setting} = {value}")
settings = {"debug": True, "verbose": False, "timeout": 30}
display_settings(**settings) # Sözlüğü açarÇıktı:
debug = True
verbose = False
timeout = 30Önemli Noktalar:
**kwargsanahtar kelime argümanlarını bir sözlükte toplar — dönüşüme gerek yoktur, zaten bir sözlüktürkwargsismi gelenekseldir -**işaretinden sonra herhangi bir isim kullanabilirsiniz- Esnek fonksiyon imzaları istediğinizde bunu kullanın
- İsteğe bağlı parametreleri veya yapılandırma ayarlarını yönetmek için harikadır
Görev
KolayBu meydan okumada, kapsamlı test kapsamına sahip bir kişi oluşturma sistemi uygulayacaksınız.
Uygulamanıza rehberlik eden TODO yorumlarını takip ederek yalnızca person_creator.py dosyasını düzenlemeniz gerekmektedir. Dosya, çeşitli özelliklere sahip kişi nesnelerini oluşturmak ve yönetmek için bir sınıf yapısı içerir.
Kopya kağıdı
**kwargs parametresi, bir metodun herhangi bir sayıda anahtar kelime argümanı kabul etmesine olanak tanır ve bunları bir sözlükte toplar:
class Person:
def __init__(self, name, **kwargs):
self.name = name
self.details = kwargs
def show_info(self):
print(f"Name: {self.name}")
for key, value in self.details.items():
print(f"{key}: {value}")
person = Person("Alice", age=25, city="New York", job="Engineer")Normal parametreleri, *args ve **kwargs yapılarını birleştirin:
class Logger:
def log(self, level, *messages, **options):
timestamp = options.get('timestamp', False)
color = options.get('color', 'default')
if timestamp:
print("[2024-01-01 12:00:00]", end=" ")
print(f"[{level}]", end=" ")
for message in messages:
print(message, end=" ")
logger = Logger()
logger.log("INFO", "User", "logged", "in", timestamp=True, color="green")** kullanarak metodları çağırırken sözlükleri açın (unpack):
settings = {"debug": True, "verbose": False, "log_level": "INFO"}
config = Config(**settings) # Sözlüğü açarSözlük metodlarını kullanarak **kwargs değerlerine erişin:
def get_setting(self, key, default=None):
return self.settings.get(key, default)
# Tüm kwargs üzerinde döngü kurun
for key, value in self.settings.items():
print(f"{key} = {value}")Kendin dene
from person_creator import create_person
# Kapsamlı test senaryosu işleyicisi
test_case = input()
if test_case == "basic_test":
create_person(name="John", age=25, occupation="Engineer")
# Çıktı:
# Şu özelliklerle kişi oluşturuldu:
# name: John
# age: 25
# occupation: Engineer
elif test_case == "empty_test":
create_person()
# Çıktı:
# Şu özelliklerle kişi oluşturuldu:
# (hiçbir özellik bulunmadığı için ek çıktı yok)
elif test_case == "many_properties":
create_person(name="Alice", age=30, occupation="Doctor", city="New York",
country="USA", hobby="Reading", email="alice@example.com")
# Çıktı:
# Şu özelliklerle kişi oluşturuldu:
# name: Alice
# age: 30
# occupation: Doctor
# city: New York
# country: USA
# hobby: Reading
# email: alice@example.com
elif test_case == "special_characters":
create_person(name="Bob", email="bob@example.com", phone="123-456-7890")
# Çıktı:
# Şu özelliklerle kişi oluşturuldu:
# name: Bob
# email: bob@example.com
# phone: 123-456-7890
elif test_case == "numeric_keys":
create_person(name="Charlie", age=35, height=175, weight=70)
# Çıktı:
# Şu özelliklerle kişi oluşturuldu:
# name: Charlie
# age: 35
# height: 175
# weight: 70
elif test_case == "boolean_values":
create_person(name="David", is_student=True, is_employed=False)
# Çıktı:
# Şu özelliklerle kişi oluşturuldu:
# name: David
# is_student: True
# is_employed: False
elif test_case == "nested_structures":
create_person(name="Eve", hobbies=["Reading", "Swimming", "Coding"],
address={"city": "Boston", "state": "MA", "zip": "02108"})
# Çıktı:
# Şu özelliklerle kişi oluşturuldu:
# name: Eve
# hobbies: ['Reading', 'Swimming', 'Coding']
# address: {'city': 'Boston', 'state': 'MA', 'zip': '02108'}
elif test_case == "unicode_characters":
create_person(name="José", city="São Paulo", country="Brasil")
# Çıktı:
# Şu özelliklerle kişi oluşturuldu:
# name: José
# city: São Paulo
# country: Brasil
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı