Search code examples
pythontelebot

Erorr: BotMessage() missing 4 required positional arguments: 'person', 'UNCletter', 'spaces', and 'input_letter'


Cannot fix the error in line 100 - txt = 'Игра "Виселица" \n' + BotMessage(). BotMessage() does not accept 4 values. How to fix this error? And are there any other potential errors in the code?

import telebot
import random


Token = '8488484'
bot = telebot.TeleBot(Token)


hangman = ['''
    +---+
        |
        |
        |
       ===''', '''
    +---+
    0   |
        |
        |
       ===''', '''
    +---+
    0   |
    |   |
        |
       ===''', '''
    +---+
    0   |
   /|   |
        |
       ===''', '''
    +---+
    0   |
   /|\  |
        |
       ===''', '''
    +---+
    0   |
   /|\  |
   /    |
       ===''', '''
    +---+
    0   |
   /|\  |
   / \  |
       ===''']

words = 'акула баран бегемот верблюд ворона гепард гиена дельфин дятел ехидна жаба жираф заяц зебра игуана кабан козёл лебедь ленивец медведь мангуст норка носорог олень пингвин попугай собака суслик тюлень утконос фазан хорёк хомяк цапля чайка щегол ягуар ястреб'.split()

def RandomWord(WordList):
    word = random.randint(0, len(WordList) - 1)
    return WordList[word]

def interface(unCorrectLetters, CorrectLetter, Riddle):
    person = hangman[len(unCorrectLetters)]


    UNCletter = str('Неправильные буквы:', end=' ')
    for letter in unCorrectLetters:
        a = str(letter, end=' ')
    

    spaces = '_' * len(Riddle)
    for i in range(len(Riddle)):
        if Riddle[i] in CorrectLetter:
            spaces = spaces[:i] + Riddle[i] + spaces[i+1:]

    for letter in spaces:
        b = str(letter, end=' ')
    
    input_letter = 'Введите букву'
    #main(person, UNCletter, spaces, input_letter)
    
    return (person, UNCletter, spaces, input_letter)
    



def Guess(message, already):
    while True:
        guess = message.text.lower()
        if len(guess) != 1:
            bot.send_message(message.from_user.id, 'Введите одну букву')
        elif guess in already:
            bot.send_message(message.from_user.id, 'Вы уже называли эту букву, введите другую')
        elif guess not in 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя':
            bot.send_message(message.from_user.id, 'Вводить можно только буквы')
        else:
            return guess

def BotMessage(person, UNCletter, spaces, input_letter):
        bot_message = person
        bot_message += "\n" + UNCletter
        bot_message += "\n" + spaces
        bot_message += "\n" + input_letter
        return bot_message

help = 'Привет! Это игра, в которой бот загадывает слово, а твоя задача его угадать. Чтобы начать игру, напиши команду /hanging'
@bot.message_handler(content_types=['text'])
def main(message):
    if message.text == '/hanging':
        txt = 'Игра "Виселица" \n' + BotMessage()
        bot.send_message(message.from_user.id, txt)
        
            
        unCorrectLetters = ''
        CorrectLetter = ''
        Riddle = RandomWord(words)

        while True:
            interface_variables = interface(unCorrectLetters, CorrectLetter, Riddle)
            guess = Guess(message, unCorrectLetters + CorrectLetter)
            if guess in Riddle:
                CorrectLetter = CorrectLetter + guess

                allLetters = True
                for i in range(len(Riddle)):
                    if Riddle[i] not in CorrectLetter:
                        allLetters = False
                        break
                if allLetters:
                    bot.send_message(message.from_user.id, 'Вы угадали! Загаданное слово - "' + Riddle + '"!')
                    break

            else:
                unCorrectLetters = unCorrectLetters + guess

                if len(unCorrectLetters) == len(hangman) - 1:
                    interface(unCorrectLetters, CorrectLetter, Riddle)
                    bot.send_message(message.from_user.id, 'Вы исчерпали все попытки! Загаданное слово - "' + Riddle + '"!')
                    break

    elif message.text == "/help":
        bot.send_message(message.from_user.id, help)
    else:
        bot.send_message(message.from_user.id, "Я тебя не понимаю. Напиши /help.")
bot.polling(none_stop=True, interval=0, timeout=120)

The code runs without errors, but when the bot receives the message ‘/hanging’ it gives an error. I've tried many ways, but none of them work.


Solution

  • Shortening the code to the error only. We can see that the error comes from calling a function that needs 4 arguments, but has none.

    def main():
    
        # error is here > missing arguments !!
        txt = 'Игра "Виселица" \n' + BotMessage()
    
        # this will work...
        txt = 'Игра "Виселица" \n' + BotMessage('a', 'b', 'c', 'd')  
        print(txt)
    
    
    def BotMessage(person, UNCletter, spaces, input_letter):
            bot_message = person
            bot_message += "\n" + UNCletter
            bot_message += "\n" + spaces
            bot_message += "\n" + input_letter
            return bot_message
    
    
    if __name__=='__main__':
        main()
    
    

    In the clean code above, it is clear that the first call to BotMessage() will fail, whereas the second call to BotMessage('a', 'b', 'c', 'd') will work.