python ссылка на локальную переменную бота Telegram перед назначением - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь создать код, который будет включать как разговор с ботом, так и команду, которая заставит бот отправлять изображение, но я всегда получаю одну и ту же ошибку.

Это части код.

import logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                     level=logging.INFO)
logger = logging.getLogger()



from telegram import (ReplyKeyboardMarkup, ReplyKeyboardRemove)
from telegram.ext import (Updater, CommandHandler, MessageHandler, Filters,
                          ConversationHandler)
from telegram.ext import Updater
updater = Updater(token='Token', use_context=True)
dispatcher = updater.dispatcher
from telegram.ext import CommandHandler
import telegram
bot = telegram.Bot('Token')

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                    level=logging.INFO)
def sic(update, context):
    chat_id=update.effective_chat.id
    file = r"C:\Users\Yoav\Desktop\sicily_bot\user_photo.jpg"
    bot.send_photo(chat_id, photo=open(file, 'rb'))
    bot.send_photo(chat_id, 'https://bitcoin.org/img/icons/opengraph.png')
def main():
    updater = Updater("Token", use_context=True)
    dp = updater.dispatcher
    conv_handler = ConversationHandler(
        entry_points=[CommandHandler('start', start)],
        
        states={
            LOOKS: [MessageHandler(Filters.regex('^(Mehh|Okay.|Great|Amazing)$'), looks)],

            PHOTO: [MessageHandler(Filters.photo, photo),
                    CommandHandler('skip', skip_photo)],

            EDUCATION: [MessageHandler(Filters.text & ~Filters.command, education),
                       CommandHandler('skip', skip_education)],

            BIO: [MessageHandler(Filters.text & ~Filters.command, bio)]
        },

        fallbacks=[CommandHandler('cancel', cancel)], 
    )
    dp.add_handler(conv_handler)
    dispatcher.add_handler(sic)
    sic = CommandHandler('sic', sic)
    
    updater.start_polling()
    updater.idle()
    
if __name__ == '__main__':
    main()

Я всегда получаю эту ошибку:

Traceback (most recent call last):
  File "C:\Users\Yoav\Desktop\sicily_bot\bot_comb.py", line 161, in <module>
    main()
  File "C:\Users\Yoav\Desktop\sicily_bot\bot_comb.py", line 151, in main
    dispatcher.add_handler(sic)
UnboundLocalError: local variable 'sic' referenced before assignment

как я могу это исправить?

заранее спасибо

Ответы [ 2 ]

0 голосов
/ 02 августа 2020
sic = CommandHandler('sic', sic)

Вы намерены этой строкой переопределить функцию sic?

Если вы хотите переопределить функцию, вы должны пометить sic как глобальную переменную: [option 1]

def main():
    global sic
    ... # same as original

, если это не ваше намерение, не назначайте sic. Я не знаю библиотеки телеграмм, но предполагаю, что объекты CommandHandler должны передаваться в dispatcher.add_handler. Это означает, что вам следует изменить свой код на:

[вариант 2]

dispatcher.add_handler(CommandHandler('sic', sic))
0 голосов
/ 02 августа 2020

Ну, а почему бы вам не поменять местами строку с dispatcher.add_handler и строку с si c = CommandHandler?

...