Jak używać i odnotowywać domyślne argumenty w funkcjach Pythona

Biznes

Ustawienie domyślnego argumentu w definicji funkcji Pythona powoduje, że wartość domyślna zostanie użyta, jeśli argument zostanie pominięty podczas wywołania funkcji.

Poniżej przedstawiono szczegółowe informacje na ten temat.

  • Ustawianie domyślnych argumentów
  • Ograniczenia dotyczące pozycji argumentów domyślnych
  • Należy pamiętać, że gdy jako wartość domyślna jest używana lista lub słownik

Ustawianie domyślnych argumentów

Jeśli w definicji funkcji nazwa argumentu = wartość domyślna, to w przypadku pominięcia odpowiedniego argumentu zostanie użyta wartość domyślna.

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

Ograniczenia dotyczące pozycji argumentów domyślnych

Umieszczenie argumentu domyślnego przed argumentem normalnym (argumentem, dla którego nie określono wartości domyślnej) podczas definiowania funkcji powoduje wystąpienie błędu.
SyntaxError

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

# SyntaxError: non-default argument follows default argument

Należy pamiętać, że gdy jako wartość domyślna jest używana lista lub słownik

Jeżeli jako wartość domyślna zostanie określony obiekt aktualizowalny (mutowalny), taki jak lista lub słownik, to obiekt ten zostanie utworzony podczas definiowania funkcji. Następnie, gdy funkcja zostanie wywołana bez odpowiedniego argumentu, zostanie użyty ten sam obiekt.

Domyślne wartości argumentów są obliczane od lewej do prawej podczas wykonywania definicji funkcji. Oznacza to, że domyślne wyrażenie argumentu jest obliczane tylko raz podczas definiowania funkcji, a przy każdym wywołaniu funkcji używana jest ta sama „obliczona” wartość.
8.7. Function definitions — Python 3.10.2 Documentation

Jeśli więc na przykład zdefiniowano funkcję, która jako domyślny argument przyjmuje listę lub słownik i dodaje do niego elementy, a następnie jest wielokrotnie wywoływana bez tego argumentu, elementy będą wielokrotnie dodawane do tego samego obiektu.

Przykład wpisu na listę.

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]

Przykład dla słownika.

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}

Przy każdym wywołaniu funkcji tworzony jest nowy obiekt.

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]