Подстановка названий параметров / функций в python

Пишу бота на aiogram, часто появляется необходимость выборки нужной функции, которая будет что-либо делать к примеру отправлять сообщение или отвечать за его изменение.

Для примера:

botMessage = await botSender.send_photo(
            chat_id=userMessage.chat.id,
            photo='https://',
            caption=message_text,
            reply_markup=keyboard,
            parse_mode='MarkdownV2'
        )

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

botMessage = await botSender.edit_photo(
            chat_id=userMessage.chat.id,
            photo='https://',
            caption=message_text,
            reply_markup=keyboard,
            parse_mode='MarkdownV2'
        )

Есть ли некая возможность передавать параметр при помощи кода в python? Пример желаемого:

action = 1
call_ = {1: 'send_photo', 2: 'edit_photo'}[action]
botMessage = await botSender.call_(
            chat_id=userMessage.chat.id,
            photo='https://',
            caption=message_text,
            reply_markup=keyboard,
            parse_mode='MarkdownV2'
        )

В этом примере как вы уже могли догадаться отправилась бы фотография, но не изменилась, если бы я в переменную присвоил 2, тогда фотография была бы изменена на другую.

Какие способы существуют реализовать это? И могли бы оставить пример к своему ответу.


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

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

В питоне все объекты можно присвоить в переменные, в т.ч. имена функций. Поэтому вроде бы так должно работать:

action = 1
call_ = {1: botSender.send_photo, 2: botSender.edit_photo}[action]
botMessage = await call_(
            chat_id=userMessage.chat.id,
            photo='https://',
            caption=message_text,
            reply_markup=keyboard,
            parse_mode='MarkdownV2'
        )

Т.е. мы присваиваем в переменную ссылку на функцию, а потом вызываем эту переменную как обычную функцию.

→ Ссылка