L'argomento **kwarg
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 43 di 64.
**kwargs è l'abbreviazione di "argomenti con nome". Permette a una funzione di accettare un numero qualsiasi di argomenti con nome (come coppie chiave=valore) senza doverli definire tutti in anticipo.
Come funziona:
*args→ raccoglie gli argomenti posizionali aggiuntivi in una tupla**kwargs→ raccoglie gli argomenti aggiuntivi con nome in un dizionario
Esempio semplice
Iniziamo con l'esempio più semplice possibile:
def greet(**kwargs):
print(kwargs)
greet(name="Alice", age=25, country="Australia")Output:
{'name': 'Alice', 'age': 25, 'country': 'Australia'}Come puoi vedere, **kwargs raccoglie automaticamente tutti gli argomenti con nome in un dizionario.
Utilizzo del dizionario
Poiché kwargs è già un dizionario, puoi iterarci direttamente:
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")Output:
Information received:
name: Bob
age: 30
job: TeacherCombinare parametri regolari con **kwargs
Puoi combinare i parametri regolari con **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")Output:
Creating profile for: Sarah
Additional details:
age: 28
city: London
hobby: Reading**kwargs vuoto
Se non vengono passati argomenti con nome, kwargs sarà un dizionario vuoto:
def show_data(**kwargs):
if kwargs:
print("Data:", kwargs)
else:
print("No data provided")
show_data() # Sin argumentos
show_data(item="apple") # Con argumentosOutput:
No data provided
Data: {'item': 'apple'}Esempio concreto: classe con **kwargs
Ecco come potresti usare **kwargs in una classe:
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()Output:
Name: Alice
age: 25
city: New York
job: EngineerEstrazione dei dizionari
Puoi anche spacchettare i dizionari quando chiami le funzioni:
def display_settings(**kwargs):
for setting, value in kwargs.items():
print(f"{setting} = {value}")
settings = {"debug": True, "verbose": False, "timeout": 30}
display_settings(**settings) # Espande il dizionarioOutput:
debug = True
verbose = False
timeout = 30Punti chiave:
**kwargsraccoglie gli argomenti con nome in un dizionario: non serve convertirli, lo sono già- Il nome
kwargsè convenzionale: puoi usare qualsiasi nome dopo** - Usalo quando vuoi firme di funzione flessibili
- È ottimo per gestire parametri facoltativi o impostazioni di configurazione
Sfida
FacileIn questa sfida, implementerai un sistema di creazione di persone con una copertura completa dei test.
Devi modificare solo il file person_creator.py, seguendo i commenti TODO che guidano la tua implementazione. Il file contiene una struttura di classe per creare e gestire oggetti persona con varie proprietà.
Provalo tu
from person_creator import create_person
# Gestore completo dei casi di test
test_case = input()
if test_case == "basic_test":
create_person(name="John", age=25, occupation="Engineer")
# Output:
# Person created with properties:
# name: John
# age: 25
# occupation: Engineer
elif test_case == "empty_test":
create_person()
# Output:
# Person created with properties:
# (nessun output aggiuntivo perché non ci sono proprietà)
elif test_case == "many_properties":
create_person(name="Alice", age=30, occupation="Doctor", city="New York",
country="USA", hobby="Reading", email="alice@example.com")
# Output:
# 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")
# Output:
# 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)
# Output:
# 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)
# Output:
# 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"})
# Output:
# 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")
# Output:
# Person created with properties:
# name: José
# city: São Paulo
# country: Brasil
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP
File esterniIntroduzione a OOPClassi vs. oggettiIl parametro selfMetodiAttributiMetodo costruttore (__init__)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa funzione super()Sovrascrittura dei metodiEreditarietà multiplaOrdine di risoluzione dei metodiRiepilogo - Gerarchia dei dipendenti7Metodi speciali
Introduzione ai metodi magiciSovraccarico degli operatoriMetodi magici dei contenitoriRiepilogo - Lista personalizzata10Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello ObserverModello Strategy2Decoratori
Introduzione ai decoratoriDecoratore di proprietàDecoratore di metodo staticoDecoratore di metodo di classe5Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàMixinMetodi statici e di classeDecorator di classeContext manager11Pattern di progettazione - Parte 2
Pattern dei comandiPattern adattatorePattern decoratorePattern metodo templatePattern statoPattern composito3Proprietà delle classi
Variabili di istanza e di classeDecorator delle proprietàAttributi privatiRiepilogo - Gestore di conti bancari6Incapsulamento
Membri pubblici, protetti e privatiModificatori di accessoOccultamento delle informazioniDecorator delle proprietà: avanzatiRipasso - Sistema di registri degli studenti12Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreTest e integrazioneEsercitati da solo: Compilatore Python online