Parametr **kwarg
Część sekcji Programowanie obiektowe ścieżki Python w Coddy. Lekcja 43 z 64.
**kwargs to skrót od „argumenty nazwane”. Pozwala funkcji przyjmować dowolną liczbę nazwanych argumentów (takich jak pary key=value) bez konieczności wcześniejszego definiowania ich wszystkich.
Jak to działa:
*args→ zbiera dodatkowe argumenty pozycyjne w krotkę**kwargs→ zbiera dodatkowe argumenty nazwane w słownik
Prosty przykład
Zacznijmy od najprostszego możliwego przykładu:
def greet(**kwargs):
print(kwargs)
greet(name="Alice", age=25, country="Australia")Wynik:
{'name': 'Alice', 'age': 25, 'country': 'Australia'}Jak widzisz, **kwargs automatycznie zbiera wszystkie argumenty nazwane do słownika.
Korzystanie ze słownika
Ponieważ kwargs jest już słownikiem, możesz bezpośrednio przejść po jego elementach:
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")Wynik:
Information received:
name: Bob
age: 30
job: TeacherŁączenie zwykłych parametrów z **kwargs
Możesz łączyć zwykłe parametry z **kwargs:
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")Wynik:
Creating profile for: Sarah
Additional details:
age: 28
city: London
hobby: ReadingPuste **kwargs
Jeśli nie zostaną przekazane żadne argumenty słów kluczowych, kwargs będzie pustym słownikiem:
def show_data(**kwargs):
if kwargs:
print("Data:", kwargs)
else:
print("No data provided")
show_data() # Bez argumentów
show_data(item="apple") # Z argumentamiWynik:
No data provided
Data: {'item': 'apple'}Przykład z życia codziennego: klasa z **kwargs
Oto, jak możesz użyć **kwargs w klasie:
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()Wynik:
Name: Alice
age: 25
city: New York
job: EngineerRozpakowywanie słowników
Możesz również rozpakowywać słowniki podczas wywoływania funkcji:
def display_settings(**kwargs):
for setting, value in kwargs.items():
print(f"{setting} = {value}")
settings = {"debug": True, "verbose": False, "timeout": 30}
display_settings(**settings) # Rozpakowuje słownikWynik:
debug = True
verbose = False
timeout = 30Najważniejsze informacje:
**kwargszbiera argumenty nazwane w słownik: nie trzeba ich konwertować, już nim są- Nazwa
kwargsjest konwencjonalna — po**możesz użyć dowolnej nazwy - Używaj tego, gdy chcesz elastycznie definiować sygnatury funkcji
- Świetnie sprawdza się przy obsłudze opcjonalnych parametrów lub ustawień konfiguracji
Wyzwanie
ŁatwyW tym wyzwaniu zaimplementujesz system tworzenia osób z kompleksowym zestawem testów.
Musisz edytować wyłącznie plik person_creator.py, kierując się komentarzami TODO, które wskazują, co należy zaimplementować. Plik zawiera strukturę klasy służącą do tworzenia osób i zarządzania obiektami osób o różnych właściwościach.
Spróbuj swoich sił
from person_creator import create_person
# Obsługa wszystkich przypadków testowych
test_case = input()
if test_case == "basic_test":
create_person(name="John", age=25, occupation="Engineer")
# Wynik:
# Person created with properties:
# name: John
# age: 25
# occupation: Engineer
elif test_case == "empty_test":
create_person()
# Wynik:
# Person created with properties:
# (brak dodatkowych danych wyjściowych, ponieważ nie ma żadnych właściwości)
elif test_case == "many_properties":
create_person(name="Alice", age=30, occupation="Doctor", city="New York",
country="USA", hobby="Reading", email="alice@example.com")
# Wynik:
# Person created with properties:
# 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")
# Wynik:
# Person created with properties:
# 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)
# Wynik:
# Person created with properties:
# name: Charlie
# age: 35
# height: 175
# weight: 70
elif test_case == "boolean_values":
create_person(name="David", is_student=True, is_employed=False)
# Wynik:
# Person created with properties:
# 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"})
# Wynik:
# Person created with properties:
# 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")
# Wynik:
# Person created with properties:
# name: José
# city: São Paulo
# country: Brasil
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektyParametr selfMetodyAtrybutyMetoda konstruktora (__init__)Powtórzenie – prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaFunkcja super()Nadpisywanie metodDziedziczenie wielokrotneKolejność rozwiązywania metodPodsumowanie – hierarchia pracowników7Metody specjalne
Wprowadzenie do metod magicznychPrzeciążanie operatorówMagiczne metody kontenerówPowtórka – własna lista10Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy2Dekoratory
Wprowadzenie do dekoratorówDekorator propertyDekorator metody statycznejDekorator metody klasowej5Polimorfizm
Ponowne omówienie nadpisywania metodTypowanie kaczeKlasy i metody abstrakcyjneProjektowanie interfejsówPodsumowanie — kalkulator kształtów8Zaawansowane koncepcje programowania obiektowego
Kompozycja a dziedziczenieMiksyMetody statyczne i klasoweDekoratory klasMenedżery kontekstu11Wzorce projektowe, część 2
Wzorzec PolecenieWzorzec AdapterWzorzec DekoratorWzorzec Metoda szablonowaWzorzec StanWzorzec Kompozyt3Właściwości klas
Zmienne instancji a zmienne klasoweDekoratory właściwościAtrybuty prywatnePowtórzenie — menedżer kont bankowych6Hermetyzacja
Public, Protected, Private — pamięćModyfikatory dostępuUkrywanie informacjiDekoratory właściwości — zaawansowanePodsumowanie — system ewidencji uczniów12Projekt: System zarządzania biblioteką
Przegląd projektuKlasy Book i UserSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraTestowanie i integracjaPoćwicz samodzielnie: Kompilator Python online