По умолчанию вызывать функцию в определении другой функции
Я написала функцию, которая имеет один необязательный аргумент:
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']