По умолчанию вызывать функцию в определении другой функции

Я написала функцию, которая имеет один необязательный аргумент:

def myfunc(a = value)
    pass

По задумке, если пользователь не вводит никакой аргумент, аргументу a должно присваиваться значение другой функции:

def myfunc(a = func())
    pass

Но так сделать не получается. Если какой-то красивый способ реализовать задумку без мам, пап и ифов?


Ответы (2 шт):

Автор решения: cauf

Оно работает

def func1():
    return 'ret1'

def func2(a = func1()):
    print(a)

func2('a')
func2()

Вывод:

a
ret1
→ Ссылка
Автор решения: nomnoms12

Так делать можно. НО инициализация значения произойдёт единожды, а не при каждом вызове функции. И если это значение будет изменяемым, Вы можете получить странное, на первый взгляд, поведение:

def func():
    return ['bacon']


def myfunc(a=func()):
    a.append('Ni!')
    print(a)


myfunc(['eggs'])  # ['eggs', 'Ni!']
myfunc()          # ['bacon', 'Ni!']
myfunc()          # ['bacon', 'Ni!', 'Ni!']
myfunc()          # ['bacon', 'Ni!', 'Ni!', 'Ni!']

В коде выше стандартное значение является ссылкой на список, поэтому его можно изменять. Чтобы этого не происходило, изменяемое значение нужно инициализировать в теле функции:

def myfunc(a=None):
    if a is None:
        a = func()  # a = ['bacon']
→ Ссылка