Como usar e anotar os argumentos predeterminados nas funcións de Python

Negocios

Establecer un argumento predeterminado nunha definición de función Python fai que se use o valor predeterminado se o argumento se omite durante unha chamada de función.

A continuación descríbense os seguintes detalles.

  • Establecemento de argumentos predeterminados
  • Restricións na posición dos argumentos predeterminados
  • Teña en conta que cando se usa unha lista ou dicionario como valor predeterminado

Establecemento de argumentos predeterminados

Se o nome do argumento = valor predeterminado na definición da función, o valor predeterminado utilizarase cando se omita o argumento correspondente.

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

Restricións na posición dos argumentos predeterminados

Colocar un argumento predeterminado antes dun argumento normal (un argumento para o que non se especifica ningún valor predeterminado) ao definir unha función provoca un erro.
SyntaxError

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

# SyntaxError: non-default argument follows default argument

Teña en conta que cando se usa unha lista ou dicionario como valor predeterminado

Se se especifica un obxecto actualizable (mutable) como unha lista ou un dicionario como valor predeterminado, ese obxecto crearase cando se defina a función. Despois, cando se chama a función sen o argumento correspondente, utilízase o mesmo obxecto.

Os valores dos argumentos predeterminados avalíanse de esquerda a dereita cando se executa a definición da función. Isto significa que a expresión do argumento predeterminada só se avalía unha vez cando se define a función e que se usa o mesmo valor “calculado” para cada chamada.
8.7. Function definitions — Python 3.10.2 Documentation

Así, por exemplo, se se define unha función que toma unha lista ou dicionario como argumento predeterminado e engade elementos a ela, e se chama varias veces sen ese argumento, engadiranse elementos ao mesmo obxecto repetidamente.

Exemplo de listaxe.

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]

Exemplo para un dicionario.

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}

Créase un novo obxecto cada vez que se chama á 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