Skip to content

Disimballare e passare liste, tuple, dict ad argomenti di funzioni in Python

Python

In Python, puoi decomprimere list, tuple, dict (dizionario) e passare i suoi elementi per come argomenti aggiungendo * alla lista o alla tupla e ** al dizionario quando si chiama la funzione.

In questo articolo vengono descritti i seguenti contenuti.

  • Decomprimere l’elenco e la tupla con *
    • Con argomenti predefiniti
    • Con argomenti a lunghezza variabile
  • Disimballare dict (dizionario) con **
    • Con argomenti predefiniti
    • Con argomenti a lunghezza variabile

Si noti che se list, tuple o dict sono specificati come argomento senza * o **, non viene decompresso e passato alla funzione così com’è.

Vedere i seguenti articoli per l’utilizzo di base delle funzioni in Python, argomenti predefiniti e argomenti a lunghezza variabile con * e ** durante la definizione di funzioni.

Decomprimere l’elenco e la tupla con *

Quando si specifica un elenco o una tupla con * come argomento, viene decompresso e ogni elemento viene passato a ciascun argomento.

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

l = ['one', 'two', 'three']

func(*l)
# arg1 = one
# arg2 = two
# arg3 = three

func(*['one', 'two', 'three'])
# arg1 = one
# arg2 = two
# arg3 = three

t = ('one', 'two', 'three')

func(*t)
# arg1 = one
# arg2 = two
# arg3 = three

func(*('one', 'two', 'three'))
# arg1 = one
# arg2 = two
# arg3 = three

Gli elenchi vengono utilizzati nel codice di esempio seguente, ma lo stesso vale per le tuple.

Se il numero di elementi non corrisponde al numero di argomenti, viene generato TypeError.

# func(*['one', 'two'])
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(*['one', 'two', 'three', 'four'])
# TypeError: func() takes 3 positional arguments but 4 were given

Con argomenti predefiniti

Se la funzione ha argomenti predefiniti, gli argomenti predefiniti vengono utilizzati se il numero di elementi è insufficiente. Se ci sono molti elementi, TypeError solleva.

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(*['one', 'two'])
# arg1 = one
# arg2 = two
# arg3 = 3

func_default(*['one'])
# arg1 = one
# arg2 = 2
# arg3 = 3

# func_default(*['one', 'two', 'three', 'four'])
# TypeError: func_default() takes from 0 to 3 positional arguments but 4 were given

Con argomenti a lunghezza variabile

Se la funzione ha un argomento a lunghezza variabile (*args), tutti gli elementi dopo l’argomento posizionale vengono all’argomento a lunghezza variabile.

def func_args(arg1, *args):
    print('arg1 =', arg1)
    print('args=", args)

func_args(*["one', 'two'])
# arg1 = one
# args = ('two',)

func_args(*['one', 'two', 'three'])
# arg1 = one
# args = ('two', 'three')

func_args(*['one', 'two', 'three', 'four'])
# arg1 = one
# args = ('two', 'three', 'four')

Disimballare dict (dizionario) con **

Aggiungendo ** a dict (dizionario) e specificandolo come argomento, le sue chiavi e valori vengono trattati come nomi e valori di argomenti. Ogni elemento viene passato come argomenti di parole chiave.

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

d = {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}

func(**d)
# arg1 = one
# arg2 = two
# arg3 = three

func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# arg2 = two
# arg3 = three

Se non ci sono sufficienti chiavi o chiavi che non sono ai nomi degli argomenti, TypeError.

# func(**{'arg1': 'one', 'arg2': 'two'})
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# TypeError: func() got an unexpected keyword argument 'arg4'

Con argomenti predefiniti

Se la funzione ha argomenti predefiniti, viene aggiornato solo il valore del nome dell’argomento corrispondente alla chiave del dizionario.

Se una chiave non corrisponde al nome dell’argomento, viene generato TypeError.

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(**{'arg1': 'one'})
# arg1 = one
# arg2 = 2
# arg3 = 3

func_default(**{'arg2': 'two', 'arg3': 'three'})
# arg1 = 1
# arg2 = two
# arg3 = three

# func_default(**{'arg1': 'one', 'arg4': 'four'})
# TypeError: func_default() got an unexpected keyword argument 'arg4'

Con argomenti a lunghezza variabile

Se la funzione ha un argomento a lunghezza variabile (**kwargs), tutti gli elementi con chiavi che non sono assegnati al nome dell’argomento vengono passati all’argomento a lunghezza variabile.

def func_kwargs(arg1, **kwargs):
    print('arg1 =', arg1)
    print('kwargs=", kwargs)

func_kwargs(**{"arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three'}

func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three', 'arg4': 'four'}

func_kwargs(**{'arg1': 'one', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg3': 'three'}