Expandir y pasar listas, tuplas y diccionarios como argumentos de funciones en Python

Negocio

En Python, las listas (arrays), tuplas y diccionarios pueden expandirse (desempacarse) y sus respectivos elementos pueden pasarse juntos como argumentos de funciones.

Cuando llame a una función, especifique el argumento con * para listas y tuplas y ** para diccionarios. Tenga en cuenta el número de asteriscos *.

Aquí se describen los siguientes detalles.

  • Expandir (desempacar) una lista o tupla con * (un asterisco)
    • Para las funciones con argumentos por defecto
    • Para las funciones con argumentos de longitud variable
  • Expandir (desempaquetar) el diccionario con ** (dos asteriscos)
    • Para las funciones con argumentos por defecto
    • Para las funciones con argumentos de longitud variable

Consulte el siguiente artículo para conocer el uso básico de las funciones de Python, los argumentos por defecto y los argumentos de longitud variable con *,** al definir las funciones.

Expandir (desempacar) una lista o tupla con * (un asterisco)

Cuando una lista o tupla se especifica como argumento con *, se expande y cada elemento se pasa como un argumento separado.

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

La siguiente explicación es para una lista, pero lo mismo se aplica a una tupla.

Si el número de elementos no coincide con el número de argumentos, se produce un error 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

Para las funciones con argumentos por defecto

Si se establece un argumento por defecto, éste se utiliza si el número de elementos es insuficiente. Si el número de elementos es demasiado grande, se produce un error TypeError.

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

Para las funciones con argumentos de longitud variable

Si se establece un argumento de longitud variable, todos los elementos después del elemento para el argumento posicional se pasan al argumento de longitud variable.

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')

Expandir (desempaquetar) el diccionario con ** (dos asteriscos)

Cuando se especifica un diccionario dict como argumento con **, las claves de los elementos se expanden como nombres de argumento y los valores como valores de argumento, y cada uno se pasa como un argumento separado.

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

Si no hay ninguna clave que coincida con el nombre del argumento o hay una clave que no coincide, se producirá un error 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'

Para las funciones con argumentos por defecto

Imagen en la que sólo se actualizan los valores de los nombres de los argumentos que coinciden con las claves del diccionario.

Una clave que no coincida con el nombre del argumento dará lugar a un error 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'

Para las funciones con argumentos de longitud variable

Si se establecen argumentos de longitud variable, cualquier elemento con una clave distinta del nombre del argumento especificado como argumento se pasa al argumento de longitud variable.

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'}
Copied title and URL