Menu
Coddy logo textTech

**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: Teacher

Normal 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: Reading

Boş **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: Engineer

Sö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:

  • **kwargs anahtar kelime argümanlarını bir sözlükte toplar — dönüşüme gerek yoktur, zaten bir sözlüktür
  • kwargs ismi 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
challenge icon

Görev

Kolay

Bu 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çar

Sö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
quiz iconKendini test et

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