如何将变量传递给不同的函数(ConversationHandler 中的不同阶段?)

How to pass a variable to a different function (a different stage in ConversationHandler?)

所以我有一个机器人,它使用阶段名称作为每个功能的 return 的乘积从一个阶段移动到另一个阶段。 例如

STEP_1, STEP_2, STEP_3 = range(3)

def askforfile(update, context):
    chat_id = update.message.chat_id
    context.bot.send_message(chat_id=chat_id, text="give a file!")
    return STEP_1

def getfile(update, context):
    chat_id = update.message.chat_id
    filename = 'newfile'+str(chat_id)+ '.txt'
    f = open(filename, 'wb')
    context.bot.get_file(update.message.document.file_id).download(out=f)
    f.close()
    return STEP_2

def get_info(update, context):
    chat_id = update.message.chat_id
    info = update.message.text
    return STEP_3

def end(update, context):
    with open(filename, 'rb') as f:
       writecsv1 = some_module.some_function(filename, info)
    with open(writecsv1, 'rb') as doc:
        context.bot.send_document(chat_id=chat_id, document=doc)
    return ConversationHandler.END 

所以在 end() 函数中,我需要从 some_function 中的函数 getfile() 和 get_info() 传递变量。但我不知道该怎么做,因为 returning 多个值对我不起作用,即使它起作用,显然我不能调用函数。

您可以使用在您的函数中重写的全局变量文件名和信息(也许不要将它们命名为)。只需在函数定义之上使用一些默认值来定义它们。现在它们只是在本地定义,一旦函数 returns.

就消失了

我强烈建议不要使用全局变量。全局变量通常被认为是不好的实践,在这种情况下,当多个用户同时使用您的机器人并且每个用户都覆盖全局变量时,它们很容易让您陷入麻烦。 python-telegram-bot 附带一个 built-in solution 用于在内存中存储数据。我建议利用它。


免责声明:我目前是 python-telegram-bot.

的维护者