Menu
Coddy logo textTech

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

Combinare 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 argumentos

Output:

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: Engineer

Estrazione 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 dizionario

Output:

debug = True
verbose = False
timeout = 30

Punti chiave:

  • **kwargs raccoglie 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
challenge icon

Sfida

Facile

In 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
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Python online