Как в python сохранить функцию с ее аргументами?
Можно ли как то сохранить функцию в переменную вместе с ее аргументами?
usecase:
get_count = lambda: int(input(f'Give me a count of cicles\n'))
opt = input('Type 1 for action_1, 2 for action_1, 3 for both\n')
if opt == '1':
if input('Type 2 for subaction\n') != '2':
start_action_1(get_count())
else:
start_sub_action_1()
elif opt == '2':
start_action_2(get_count())
else:
asyncio.run(main(get_count(), get_count()))
Проблема в том, что перед каждым "action" нужно вызвать "run_system", однако не хочется писать "run_system" в каждой ветке (заранее запустить нельзя). Делать "get_count" глобальной функцией так-же не хочется, т.к. она нужна только здесь. Пример возможно не самый хороший, но вопрос актуальный.
Ответы (1 шт):
Автор решения: Garry Galler
→ Ссылка
Можно ли как то сохранить функцию в переменную вместе с ее аргументами?
Можно. Для этого существует каррирование и частичное применение функции. В python последнее реализуется через functools.partial.
>>> def count_animals(number, kind, adjective='big'):
print('%s %s %s' % (number, adjective, kind))
>>> count_cats = partial(count_animals, kind='cats')
>>> count_cats
functools.partial(<function count_animals at 0x0000000003C0C4C0>, kind='cats')
>>> count_cats(1)
1 big cats
>>> one_count_cats = partial(count_animals, 1, kind='cats')
>>> one_count_cats()
1 big cats
>>> two_count_cats = partial(count_animals, 2, kind='cats')
>>> two_count_cats()
2 big cats
>>>
>>> two_count_cats = partial(count_cats, 2) # используем здесь предыдущую частичную функцию, чтобы сделать другую частичную функцию.
>>> two_count_cats()
2 big cats
>>> five_count_cats = partial(count_cats, 5)
>>> five_count_cats()
5 big cats
>>>