【问题标题】:How to pass a returned value of a function to another function while both functions require different messages from a user in Python 3?如何将一个函数的返回值传递给另一个函数,而这两个函数都需要来自 Python 3 中用户的不同消息?
【发布时间】:2023-12-09 06:25:01
【问题描述】:

最近我遇到了一个问题。问题是我正在尝试使用 telebot 在 Telegram 中创建一个机器人。问题的核心是混合来自用户的输入。我浏览了各种文章并决定摆脱在多个用户激活机器人时混合的主要全局变量。当我试图只使用本地变量并将值从一个函数传递给另一个函数时,我无法解决这个问题:当函数 def dicties(url_new) 设法返回值时 - 然后我不知道如何在函数 def answer(message) 中使用返回值 - 我需要字典来计算调整后的汇率。

我已尝试将所有功能置于 def answer(message) 下,但它需要来自 def day_step(message) 的特定键盘回答(如“Доллар Сингапура”)而不是来自用户的消息 - 消息不同,否则代码崩溃。那么,有没有办法不使用全局变量并将返回保存在某处而无需再次输入消息?

def urlnew(message):
date = str(message.text)
url_new = url.replace('dd/mm/year', date)
print(url_new)
return url_new


def dicties(url_new):
    currency_dictionary = get_currencies_dictionary(get_data(url_new))
    nominal_dictionary = get_nominals_dictionary(get_data(url_new))
    print(currency_dictionary)
    print(nominal_dictionary)
    return currency_dictionary, nominal_dictionary


def day_step(message):
    dicties(urlnew(message))
    markup = types.ReplyKeyboardMarkup(resize_keyboard=None)
    itembtn_sgd = types.KeyboardButton('Доллар Сингапура')
    itembtn_back_to_dates = types.KeyboardButton('Вернуться к вводу даты')
    markup.add(itembtn_back_to_dates, itembtn_sgd)
    msg1 = bot.send_message(message.chat.id, text='Выбери одну или вернись к выбору даты', reply_markup=markup)
    bot.register_next_step_handler(msg1, answer)
 

def answer(message):
    markup = types.ReplyKeyboardRemove(selective=False)
    if message.text == 'Вернуться к вводу даты':
        bot.register_next_step_handler(message, welcoming)
    elif message.text == 'Доллар Сингапура':
        bot.send_message(message.chat.id, text='Вот столько стоил один доллар Сингапура в рублях: ' + str(float(currency_dictionary['SGD'] / nominal_dictionary['SGD'])), reply_markup=markup)
    else:
        bot.send_message(message.chat.id, text='Упс, что-то не так', reply_markup=markup)
        bot.send_message(message.chat.id, text='Но ты можешь посмотреть сам по ссылке: ' + str(url_new))

提前致谢。

【问题讨论】:

    标签: python py-telegram-bot-api


    【解决方案1】:

    我不确定我是否理解正确,但我想我会这样做;

    def answer(message):
        markup = types.ReplyKeyboardRemove(selective=False)
        url_new = urlnew(message)
        currency_dictionary, nominal_dictionary = dicties(url_new)
        if message.text == 'Вернуться к вводу даты':
            bot.register_next_step_handler(message, welcoming)
        elif message.text == 'Доллар Сингапура':
            bot.send_message(message.chat.id, text='Вот столько стоил один доллар Сингапура в рублях: ' + str(float(currency_dictionary['SGD'] / nominal_dictionary['SGD'])), reply_markup=markup)
        else:
            bot.send_message(message.chat.id, text='Упс, что-то не так', reply_markup=markup)
            bot.send_message(message.chat.id, text='Но ты можешь посмотреть сам по ссылке: ' + str(url_new))
    

    【讨论】:

    • 不完全是。我需要的是这样的:例如,url 函数需要严格的格式日期 - 05/12/2020。并且函数 asnwer 只需要来自 if-elif 选项的短语。如果我采用您的代码示例,则 url 函数消息会与 def 答案混合并崩溃,因为它无法处理 url 消息。
    最近更新 更多