Как задать название функции для register_next_step_handler?

msg = bot.send_message(cid, """ Enter the number of """ + str(m.text), parse_mode='Markdown', reply_markup=card)
step = card+str(m.text)
bot.register_next_step_handler(msg, step)


Пользователь отправляет название карты(m.text).
Register_next_step_handler, после ввода количества карт пользователем, должен отправить его дальше в функцию вида card+m.text
Как это реализовать?
Код выше неверный, тк str object is not callable и unicode object is not callable
  • Вопрос задан
  • 428 просмотров
Решения вопроса 1
@javedimka
Хочу сока
Ничего не понял, но наверное как-то так
>>> def heyfunc():
...     print('hey')
...     
>>> def supfunc():
...     print('sup')
...     
>>> funcdict = {'heyfunc': heyfunc, 'supfunc': supfunc}
>>> f_name = input()
hey
>>> next_func = funcdict.get(f_name+'func')
>>> next_func
<..function heyfunc at 0x10926d268..>
>>> next_func()
hey

Кстати, если хочется упороться, то можно сделать декоратор:
card_funcs = {}

def register_cf(card_func):
    '''register card function'''
    card_funcs[card_func.__name__] = card_func
    return card_func

@register_cf
def card_func1():
    print('Running card1')

@register_cf
def card_func2():
    print('Running card2')

@register_cf
def card_func3():
    print('Running card3')
    
if __name__ == '__main__':
    print('running funcs from registry:')
    for fn, fobj in card_funcs.items():
        print(fn, '->', fobj)
        fobj()

-----
running funcs from registry:
card_func3 -> <..function card_func3 at 0x1069ae9d8..>
Running card3
card_func2 -> <..function card_func2 at 0x1071ea9d8..>
Running card2
card_func1 -> <..function card_func1 at 0x10db190d0..>
Running card1

Не надо словарь хардкодить + удобно расширять
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы