7.1 Ottenere tutti gli argomenti della funzione
In Python ci sono diversi modi molto comodi per ottenere dall'interno della funzione la lista di tutti i parametri passati. Diamo uno sguardo a questi metodi.
Utilizzo di *args
*args permette di passare un numero variabile di argomenti posizionali (normali) alla funzione. Questi argomenti sono impacchettati in una tupla e possono essere gestiti all'interno della funzione.
def print_numbers(*args):
for arg in args:
print(arg)
print_numbers(1, 2, 3, 4, 5)
Spiegazione
La funzione print_numbers accetta un numero arbitrario di argomenti posizionali, impacchettati in una tupla args. Possiamo iterare gli argomenti nella funzione con un ciclo for.
Vantaggi
- Flessibilità: Permette di passare qualsiasi numero di argomenti alla funzione.
- Versatilità: Può essere utilizzato per funzioni con un numero indefinito di parametri.
Utilizzo di **kwargs
**kwargs permette di passare un numero variabile di argomenti nominati alla funzione. Questi argomenti sono impacchettati in un dizionario e possono essere gestiti all'interno della funzione.
def print_person_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_person_info(name="Alice", age=30, city="New York")
Spiegazione
La funzione print_person_info accetta un numero arbitrario di argomenti nominati, impacchettati in un dizionario kwargs. Possiamo iterare gli argomenti nella funzione con il metodo items() del dizionario.
Vantaggi
- Flessibilità: Permette di passare qualsiasi numero di argomenti nominati alla funzione.
- Leggibilità: Gli argomenti nominati rendono le chiamate alle funzioni più leggibili.
7.2 Fissare il tipo di argomenti
Solo argomenti posizionali
In Python 3.8 e superiori, puoi definire funzioni con argomenti posizionali, che possono essere passati solo per posizione. Questo si fa con il simbolo / nella definizione della funzione.
def greet(name, /, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Output: Hello, Alice!
greet("Alice", greeting="Hi") # Output: Hi, Alice!
# greet(name="Alice") # Errore: TypeError
Spiegazione
La funzione greet accetta l'argomento name, che può essere passato solo per posizione. Argomenti prima di / possono essere passati solo per posizione.
Questo approccio consente di limitare il modo in cui gli argomenti sono passati, migliorando la leggibilità e prevenendo errori.
Solo argomenti nominati (Keyword-Only Arguments)
È anche possibile definire parametri di funzione che possono essere passati solo per nome. Questo si fa con il simbolo * nella definizione della funzione.
def greet(*, name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet(name="Alice") # Output: Hello, Alice!
greet(name="Alice", greeting="Hi") # Output: Hi, Alice!
# greet("Alice") # Errore: TypeError
La funzione greet accetta l'argomento name, che può essere passato solo per nome. Argomenti dopo * possono essere passati solo per nome.
Questo approccio costringe a specificare esplicitamente i nomi degli argomenti, migliorando la leggibilità del codice.
Combinazione di argomenti posizionali e nominati
È anche possibile combinare argomenti posizionali e nominati per ottenere la massima flessibilità.
def greet(name, /, *, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Output: Hello, Alice!
greet("Alice", greeting="Hi") # Output: Hi, Alice!
# greet(name="Alice") # Errore: TypeError
La funzione greet accetta l'argomento name, che può essere passato solo per posizione, e l'argomento nominato greeting, che deve necessariamente essere passato per nome. L'uso di / e * consente di combinare argomenti posizionali e nominati.
Esempio completo di tutte e tre le situazioni:
def full_example(a, b, /, c, d, *, e, f):
print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
# Chiamata della funzione con diversi argomenti
full_example(1, 2, 3, 4, e=5, f=6) # Tutti gli argomenti sono passati correttamente
# full_example(a=1, b=2, c=3, d=4, e=5, f=6) # Errore: TypeError
Spiegazione
- Solo argomenti posizionali:
aebdevono essere passati solo per posizione. - Argomenti posizionali o nominati normali:
cedpossono essere passati sia per posizione che per nome. - Solo argomenti nominati:
eefdevono essere passati solo per nome.
GO TO FULL VERSION