Cómo utilizar y anotar los argumentos por defecto en las funciones de Python

Negocio

Establecer un argumento por defecto en la definición de una función de Python hace que se utilice el valor por defecto si el argumento se omite durante una llamada a la función.

A continuación se describen los siguientes detalles.

  • Establecer los argumentos por defecto
  • Restricciones en la posición de los argumentos por defecto
  • Tenga en cuenta que cuando se utiliza una lista o un diccionario como valor por defecto

Establecer los argumentos por defecto

Si el nombre del argumento = valor por defecto en la definición de la función, se utilizará el valor por defecto cuando se omita el argumento correspondiente.

def func_default(arg1, arg2='default_x', arg3='default_y'):
    print(arg1)
    print(arg2)
    print(arg3)

func_default('a')
# a
# default_x
# default_y

func_default('a', 'b')
# a
# b
# default_y

func_default('a', arg3='c')
# a
# default_x
# c

Restricciones en la posición de los argumentos por defecto

Colocar un argumento por defecto antes de un argumento normal (un argumento para el que no se especifica un valor por defecto) al definir una función da lugar a un error.
SyntaxError

# def func_default_error(arg2='default_a', arg3='default_b', arg1):
#     print(arg1)
#     print(arg2)

# SyntaxError: non-default argument follows default argument

Tenga en cuenta que cuando se utiliza una lista o un diccionario como valor por defecto

Si se especifica un objeto actualizable (mutable), como una lista o un diccionario, como valor por defecto, ese objeto se creará cuando se defina la función. Luego, cuando se llame a la función sin el argumento correspondiente, se utilizará el mismo objeto.

Los valores de los argumentos por defecto se evalúan de izquierda a derecha cuando se ejecuta la definición de la función. Esto significa que la expresión del argumento por defecto se evalúa sólo una vez cuando se define la función, y se utiliza el mismo valor «calculado» para cada llamada.
8.7. Function definitions — Python 3.10.2 Documentation

Así, por ejemplo, si se define una función que toma una lista o un diccionario como argumento por defecto y le añade elementos, y se llama varias veces sin ese argumento, se añadirán elementos al mismo objeto repetidamente.

Ejemplo para un listado.

def func_default_list(l=[0, 1, 2], v=3):
    l.append(v)
    print(l)

func_default_list([0, 0, 0], 100)
# [0, 0, 0, 100]

func_default_list()
# [0, 1, 2, 3]

func_default_list()
# [0, 1, 2, 3, 3]

func_default_list()
# [0, 1, 2, 3, 3, 3]

Ejemplo para un diccionario.

def func_default_dict(d={'default': 0}, k='new', v=100):
    d[k] = v
    print(d)

func_default_dict()
# {'default': 0, 'new': 100}

func_default_dict(k='new2', v=200)
# {'default': 0, 'new': 100, 'new2': 200}

Se crea un nuevo objeto cada vez que se llama a la función.

def func_default_list_none(l=None, v=3):
    if l is None:
        l = [0, 1, 2]
    l.append(v)
    print(l)

func_default_list_none()
# [0, 1, 2, 3]

func_default_list_none()
# [0, 1, 2, 3]
Copied title and URL