1 / 1 / 1
Регистрация: 17.05.2013
Сообщений: 146
1

NameError: name 'self' is not defined

01.07.2020, 21:47. Показов 2926. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Пишу с горем пополам бота, сто раз уже менял логику, теперь вылетает ошибка:
@self.bot.message_handler(commands=['start'])
NameError: name 'self' is not defined
Не могу найти решение, подскажите)
Код прилагаю
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import config
import mail
import exmo_exchange
import telebot
from telebot import types
from random import randint
 
class MyBot:
    def __init__(self):
        self.bot=telebot.TeleBot(config.token)
        self.keyboard1=telebot.types.ReplyKeyboardMarkup(True)
        self.keyboard1.row('EXMO')
        self.keyboard2=telebot.types.ReplyKeyboardMarkup(True)
        self.keyboard2.row('Да',' Нет')
        self.keyboard3=telebot.types.ReplyKeyboardMarkup(True)
        self.keyboard3.row('Я ОПЛАТИЛ')
        self.summi_coda_i_plati=[]
        
        self.bot.polling()
 
    """
    bot=telebot.TeleBot(config.token)
    keyboard1=telebot.types.ReplyKeyboardMarkup(True)
    keyboard1.row('EXMO')
    keyboard2=telebot.types.ReplyKeyboardMarkup(True)
    keyboard2.row('Да',' Нет')
    keyboard3=telebot.types.ReplyKeyboardMarkup(True)
    keyboard3.row('Я ОПЛАТИЛ')
    summi_coda_i_plati=[]
    """
    @self.bot.message_handler(commands=['start'])
    def start_messages(message):
        msg=bot.send_message(message.chat.id, 'Привет, что хотите обменять?: ',reply_markup=keyboard1)
 
    @bot.message_handler(content_types=["text"])
    def send_text(message):
        try:
            if message.text.lower()=='exmo':
                msg=bot.send_message(message.chat.id,'Введите сумму в EXMO')
            elif message.text.lower()=='btc':
                msg=bot.send_message(message.chat.id,'Введите сумму в BTC')
            bot.register_next_step_handler(msg, send_digit)
        except Exception as e:
            bot.reply_to(message,'Чтобы начать сначала нажмите "/start"')
 
 
    def send_digit (message):
        summ=message.text
        if summ.isdigit():
            summi_coda_i_plati.append(int(summ))
            summ2=int(summ)*1.10
            summ3=int(summ2)+randint(-3,+9)
            summi_coda_i_plati.append(str(summ3))
            otvet=str(summ3)+' рублей на карту'
            msg=bot.send_message(message.chat.id,otvet)
            msg=bot.send_message(message.chat.id,' Готов?',reply_markup=keyboard2)
            bot.register_next_step_handler(msg, send_number)
        else:
            msg=bot.send_message(message.chat.id,'Вы ввели некорректные данные. Чтобы начать сначала, нажмите "/start"')
            bot.register_next_step_handler(msg, start_messages)
        
 
    def send_number (message):
        if message.text.lower()=='да':
            number='5536 9137 7601 0502'
            otvet='Переведите на номер карты "Тинькофф ": '+number+''' указанную выше сумму.
            После оплаты нажмите ОДИН РАЗ "Я ОПЛАТИЛ" и ждите получения кода.
            Как только средства поступят, бот выдаст код. Не нужно жать кнопку несколько раз.
            ПЕРЕВОДИТЕ ТОЧНО ТУ СУММУ, ЧТО УКАЗАНА БОТОМ, ИНАЧЕ ВОЗНИКНУТ СЛОЖНОСТИ С ВЫДАЧЕЙ КОДА'''
            msg=bot.send_message(message.chat.id, otvet,reply_markup=keyboard3 )
            bot.register_next_step_handler(msg, send_code)
        else:
            msg=bot.send_message(message.chat.id, 'Чтобы начать сначала нажмите "/start" ')
            bot.register_next_step_handler(msg, start_messages)
        
 
    def send_code(message):
        if message.text.lower()=='я оплатил':
            user_id=message.from_user.id
            name_of_user=message.from_user.username
            excode_to_send=mail.email_check(summi_coda_i_plati[0],summi_coda_i_plati[1])
            msg=bot.send_message(message.chat.id,excode_to_send)
 
bot=MyBot()
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2020, 21:47
Ответы с готовыми решениями:

NameError: name 'a' is not defined
Задача при вводе в дискорд команды /random x y где х - всего игроков у - количество 'лохов'...

NameError: name 'vk' is not defined
Что я делаю не так? При отправке сообщения пишет: "Traceback (most recent call last): File...

NameError: name 'vk_session' is not defined
# -*- coding: utf-8 -*- import vk_api from vk_api.longpoll import VkLongPoll, VkEventType ...

NameError: name self is not defined
def add_cat(self, row, col): self._cat_list.append((row, col)) Traceback (most recent...

14
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
01.07.2020, 21:51 2
Тебе надо не ботов писать, а изучать основы программирования и ООП.
Боты это сложно, если ты не в курсе.

Добавлено через 1 минуту
Цитата Сообщение от bochik Посмотреть сообщение
Переведите на номер карты "Тинькофф
Ты реально думаешь, что кто-то переведет бесполезному боту?
1
Заклинатель змей
700 / 555 / 219
Регистрация: 30.04.2016
Сообщений: 2,591
01.07.2020, 21:53 3
bochik, self не существует в области видимости декоратора. self вообще существует только внутри нестатичных методов
0
4937 / 3290 / 1140
Регистрация: 21.03.2016
Сообщений: 8,069
01.07.2020, 21:54 4

Не по теме:

Garry Galler, все крутые кулцхакеры начинают с ботов а основы и начальные понятия пусть ботаны изучают а мы потом их будем вопросами засыпать почему не работает и как правильно.

0
1 / 1 / 1
Регистрация: 17.05.2013
Сообщений: 146
01.07.2020, 22:09  [ТС] 5
Цитата Сообщение от Garry Galler Посмотреть сообщение
Тебе надо не ботов писать, а изучать основы программирования и ООП.
Боты это сложно, если ты не в курсе.
Вообще я его изначально написал без класса, и всё работало, но была проблема в том, что когда несколько пользователей обращаются к нему, то он отправляет некорректные данные. А в ООП я его обернул по совету одного мудрого

Цитата Сообщение от Garry Galler Посмотреть сообщение
Ты реально думаешь, что кто-то переведет бесполезному боту?
Он не бесполезен, лучше б помогли, чем критиковать
0
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
01.07.2020, 23:58 6
Цитата Сообщение от bochik Посмотреть сообщение
была проблема в том, что когда несколько пользователей обращаются к нему, то он отправляет некорректные данные
Ту думаешь, что решил эту проблему?

Цитата Сообщение от bochik Посмотреть сообщение
в ООП я его обернул
Ты его не в ООП обернул. А во что-то известное только тебе. ООП тут даже рядом стоять побоится - его сразу стошнит.

Цитата Сообщение от bochik Посмотреть сообщение
лучше б помогли
Я как могу помогаю всем ботописателям - отправляю каждого изучать программирование и документацию.
Ты ведь не успел еще сделать ни того, ни другого.
Другая помощь тут бесполезна.
Как только научишься делать что-то сложнее чем складывать строки плюсиками (а ведь уже давно f-string есть!), вот тогда и получишь реальную помощь.
Ты ведь даже не в курсе, что бот это серверное приложение (микросайт!). И для того, чтобы понимать как строить его архитектуру, ты должен понимать как устроен web и владеть кучей технологий.
Цитата Сообщение от bochik Посмотреть сообщение
Он не бесполезен,
Да ну...?
0
1 / 1 / 1
Регистрация: 17.05.2013
Сообщений: 146
02.07.2020, 08:20  [ТС] 7
Цитата Сообщение от Garry Galler Посмотреть сообщение
Ту думаешь, что решил эту проблему?
Нет. проблему я эту не решил, и решать мне придётся её долго, потому что помощи ни от кого не дождёшься, а тут на форуме у всех такая привычка "отправлять к документации". Я перелопатил всё, что только можно и нигде не нашёл ответа на вопрос. Покажите мне в документации, где конкретно об этом пишут? Что мне нужно конкретно прочитать?
Изначально, как я уже уже говорил, код был другим:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import config
import mail
import exmo_exchange
import telebot
from telebot import types
from random import randint
from class_summ import *
 
bot=telebot.TeleBot(config.token)
keyboard1=telebot.types.ReplyKeyboardMarkup(True)
keyboard1.row('EXMO')
keyboard2=telebot.types.ReplyKeyboardMarkup(True)
keyboard2.row('Да',' Нет')
keyboard3=telebot.types.ReplyKeyboardMarkup(True)
keyboard3.row('Я ОПЛАТИЛ')
summi_coda_i_plati=[]
 
@bot.message_handler(commands=['start'])
def start_messages(message):
    msg=bot.send_message(message.chat.id, 'Привет, что хотите обменять?: ',reply_markup=keyboard1)
 
@bot.message_handler(content_types=["text"])
def send_text(message):
    try:
        if message.text.lower()=='exmo':
            msg=bot.send_message(message.chat.id,'Введите сумму в EXMO')
        elif message.text.lower()=='btc':
            msg=bot.send_message(message.chat.id,'Введите сумму в BTC')
        bot.register_next_step_handler(msg, send_digit)
    except Exception as e:
        bot.reply_to(message,'Чтобы начать сначала нажмите "/start"')
 
 
def send_digit (message):
    summ=message.text
    if summ.isdigit():
        summi_coda_i_plati.append(int(summ))
        summ2=int(summ)*1.10
        summ3=int(summ2)+randint(-3,+9)
        summi_coda_i_plati.append(str(summ3))
        global my_summ
        
        otvet=str(summ3)+' рублей на карту'
        msg=bot.send_message(message.chat.id,otvet)
        msg=bot.send_message(message.chat.id,' Готов?',reply_markup=keyboard2)
        bot.register_next_step_handler(msg, send_number)
    else:
        msg=bot.send_message(message.chat.id,'Вы ввели некорректные данные. Чтобы начать сначала, нажмите "/start"')
        bot.register_next_step_handler(msg, start_messages)
    
 
def send_number (message):
    if message.text.lower()=='да':
        number='5555 5555 5555 5555'
        otvet='Переведите на номер карты "Тинькофф ": '+number+''' указанную выше сумму.
        После оплаты нажмите ОДИН РАЗ "Я ОПЛАТИЛ" и ждите получения кода.
        Как только средства поступят, бот выдаст код. Не нужно жать кнопку несколько раз.
        ПЕРЕВОДИТЕ ТОЧНО ТУ СУММУ, ЧТО УКАЗАНА БОТОМ, ИНАЧЕ ВОЗНИКНУТ СЛОЖНОСТИ С ВЫДАЧЕЙ КОДА'''
        msg=bot.send_message(message.chat.id, otvet,reply_markup=keyboard3 )
        bot.register_next_step_handler(msg, send_code)
    else:
        msg=bot.send_message(message.chat.id, 'Чтобы начать сначала нажмите "/start" ')
        bot.register_next_step_handler(msg, start_messages)
    
 
def send_code(message):
    if message.text.lower()=='я оплатил':
        user_id=message.from_user.id
        name_of_user=message.from_user.username
        excode_to_send=mail.email_check(summa_coda_i_plati[0],summa_coda_i_plati[1])
        msg=bot.send_message(message.chat.id,excode_to_send)
        
bot.polling()
Я подумал, что дело скорее в списке
Python
1
summa_coda_i_plati
Цитата Сообщение от Garry Galler Посмотреть сообщение
Ты ведь даже не в курсе, что бот это серверное приложение (микросайт!). И для того, чтобы понимать как строить его архитектуру, ты должен понимать как устроен web и владеть кучей технологий.
Я понимаю, какое это приложение, и не думаю, что мне нужно владеть кучей каких-то технологий
0
Модератор
Эксперт Python
2687 / 1593 / 513
Регистрация: 21.02.2017
Сообщений: 4,209
Записей в блоге: 1
02.07.2020, 08:53 8
bochik, если ты создаешь приложение которое "обменивает" деньги, логично что ты должен все знать и даже больше. Если ты не знаешь основ, то как мы тебе поможем? Если ты не видишь в доках ответы на свои вопросы, значит стоит задуматься, а правильно ли ты строишь алгоритм программы, и правильно ли используешь функции и методы. Я пробежался по твоему коду, и мне хватило 10 секунд понять, что этот код - ужасен.
0
1 / 1 / 1
Регистрация: 17.05.2013
Сообщений: 146
02.07.2020, 09:36  [ТС] 9
Цитата Сообщение от DmFat Посмотреть сообщение
Я пробежался по твоему коду, и мне хватило 10 секунд понять, что этот код - ужасен.
Здравствуйте! Можно поконкретней, что в нём не так? Хочу отметить, как бы ужасен он ни был, он работает, когда пользователи обращаются к нему по очереди, а начинает путаться, когда к нему обращается сразу несколько пользователей.
0
Модератор
Эксперт Python
2687 / 1593 / 513
Регистрация: 21.02.2017
Сообщений: 4,209
Записей в блоге: 1
02.07.2020, 10:22 10
bochik,

Т. к. я не знаю про telebot и вытекающие, я возьму второй пример, без реализации ООП.

1) Я вижу там страшное слово: global;
2) Я не вижу алгоритм обработки действий (то бишь если юзер нажал старт, то дальше он просто плюется как ему вздумается);
3) Если ты даешь выбор юзеру, то по факту надо выбор обрабатывать.

Добавлено через 18 минут
Написано на коленке, по этому нуждается в правке(скорее всего):

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import telebot
 
 
client = telebot.TeleBot("Token")
 
@client.message_handler(commands=["start"])
def start_message(message):
    ...
 
@client.message_handler(commands=["choose"])
def choose_message(message):
    keyboard = telebot.types.InlineKeyboardMarkup(True)
    keyboard.row(
        telebot.types.InlineKeyboardButton("EXMO -> BTC", callback_data="Currency EXMO BTC"),
        telebot.types.InlineKeyboardButton("BTC -> EXMO", callback_data="Currency BTC EXMO"),
        )
    client.send_message(message.chat.id, "Привет, что хотите обменять?", reply_keyboard=keyboard)
 
 
@client.callback_query_handler(func=lambda call: call.data.startswith("Currency"))
def choose_callback(query):
    _, from_currency, to_currency = query.data.split()
    client.send_message(query.message.chat.id, f"Выбран метод из {from_currency} в {to_currency}!")
0
1 / 1 / 1
Регистрация: 17.05.2013
Сообщений: 146
02.07.2020, 10:39  [ТС] 11
Цитата Сообщение от DmFat Посмотреть сообщение
1) Я вижу там страшное слово: global;
Эта переменная осталась от одного из вариантов, я её нигде не использую) Можете посмотреть)
Цитата Сообщение от DmFat Посмотреть сообщение
2) Я не вижу алгоритм обработки действий (то бишь если юзер нажал старт, то дальше он просто плюется как ему вздумается);
Как нет обработки, там у меня на каждом шаге кнопки, если пользователь вводит не те данные, его отфутболивает на "/старт"
Я думаю, что у меня всё дело в списке, потому что список изменяется на месте и тогда он в каждой сессии переписывается. Мне нужно, чтобы для каждой сесси (для каждого пользователя) :
Цитата Сообщение от bochik Посмотреть сообщение
summi_coda_i_plati.append(int(summ))
Цитата Сообщение от bochik Посмотреть сообщение
summi_coda_i_plati.append(str(summ3))
вот эти переменные были уникальными. Вот в этом у меня загвоздка, а не в отсутствии знания "основ")))
Можете что-нибудь подсказать, буду весьма признателен)
0
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
02.07.2020, 13:38 12
Цитата Сообщение от bochik Посмотреть сообщение
Вот в этом у меня загвоздка, а не в отсутствии знания "основ")))
Как раз в отсутствии знаний основ. Потому что правильно запилить сессии, это и есть знание основ web.
И вообще люди для нормальной авторизации пользователей и их запоминания используют БД, а не наколеночный список.
0
1 / 1 / 1
Регистрация: 17.05.2013
Сообщений: 146
02.07.2020, 14:21  [ТС] 13
Цитата Сообщение от Garry Galler Посмотреть сообщение
Как раз в отсутствии знаний основ. Потому что правильно запилить сессии, это и есть знание основ web.
Ну. может, уже что-нибудь конкретное посоветуете, туториал какой-нибудь, или ещё что?) Вот по конкретной проблеме.
Цитата Сообщение от Garry Galler Посмотреть сообщение
И вообще люди для нормальной авторизации пользователей и их запоминания используют БД, а не наколеночный список.
Я уже отказался от списка, придумал по другому и всё работает, только опять столкнулся с этой проблемой, при многопользовательском обращении
Вот код:
Python
1
2
3
4
5
6
7
8
9
10
11
class MyBot:
    def __init__(self, bot,keyboard1, keyboard2, keyboard3,summa_coda,summa_plati):
        self.bot=bot
        self.keyboard1=keyboard1
        self.keyboard1.row('EXMO')
        self.keyboard2=keyboard2
        self.keyboard2.row('Да',' Нет')
        self.keyboard3=keyboard3
        self.keyboard3.row('Я ОПЛАТИЛ')
        self.summa_coda=summa_coda
        self.summa_plati=summa_plati
===
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import config
import mail
import exmo_exchange
import telebot
from telebot import types
from random import randint
from class_bot import *
        
summa_coda=0
summa_plati=''
mybot_1=MyBot(telebot.TeleBot(config.token),telebot.types.ReplyKeyboardMarkup(True),telebot.types.ReplyKeyboardMarkup(True), telebot.types.ReplyKeyboardMarkup(True),summa_coda,summa_plati)           
 
@mybot_1.bot.message_handler(commands=['start'])
def start_messages(message):
    msg=mybot_1.bot.send_message(message.chat.id, 'Привет, что хотите обменять?: ',reply_markup=mybot_1.keyboard1)
 
@mybot_1.bot.message_handler(content_types=["text"])
def send_text(message):
    try:
        if message.text.lower()=='exmo':
            msg=mybot_1.bot.send_message(message.chat.id,'Введите сумму в EXMO')
        elif message.text.lower()=='btc':
            msg=mybot_1.bot.send_message(message.chat.id,'Введите сумму в BTC')
        mybot_1.bot.register_next_step_handler(msg, send_digit)
    except Exception as e:
        mybot_1.bot.reply_to(message,'Чтобы начать сначала нажмите "/start"')
 
 
def send_digit (message):
    summ=message.text
    if summ.isdigit():
        mybot_1.summa_coda=int(summ)
        summ2=int(summ)*1.10
        summ3=int(summ2)+randint(-3,+9)
        mybot_1.summa_plati=str(summ3)
        otvet=str(summ3)+' рублей на карту'
        msg=mybot_1.bot.send_message(message.chat.id,otvet)
        msg=mybot_1.bot.send_message(message.chat.id,' Готов?',reply_markup=mybot_1.keyboard2)
        mybot_1.bot.register_next_step_handler(msg, send_number)
    else:
        msg=mybot_1.bot.send_message(message.chat.id,'Вы ввели некорректные данные. Чтобы начать сначала, нажмите "/start"')
        mybot_1.bot.register_next_step_handler(msg, start_messages)
        
 
def send_number (message):
    if message.text.lower()=='да':
        number='5555 5555 5555 5555'
        otvet='Переведите на номер карты "Тинькофф ": '+number+''' указанную выше сумму.
            После оплаты нажмите ОДИН РАЗ "Я ОПЛАТИЛ" и ждите получения кода.
            Как только средства поступят, бот выдаст код. Не нужно жать кнопку несколько раз.
            ПЕРЕВОДИТЕ ТОЧНО ТУ СУММУ, ЧТО УКАЗАНА БОТОМ, ИНАЧЕ ВОЗНИКНУТ СЛОЖНОСТИ С ВЫДАЧЕЙ КОДА'''
        msg=mybot_1.bot.send_message(message.chat.id, otvet,reply_markup=mybot_1.keyboard3 )
        mybot_1.bot.register_next_step_handler(msg, send_code)
    else:
        msg=mybot_1.bot.send_message(message.chat.id, 'Чтобы начать сначала нажмите "/start" ')
        mybot_1.bot.register_next_step_handler(msg, start_messages)
        
 
def send_code(message):
    if message.text.lower()=='я оплатил':
        user_id=message.from_user.id
        name_of_user=message.from_user.username
        excode_to_send=mail.email_check(mybot_1.summa_coda,mybot_1.summa_plati)
        msg=mybot_1.bot.send_message(message.chat.id,excode_to_send)
        
mybot_1.bot.polling()
0
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
02.07.2020, 14:47 14
Цитата Сообщение от bochik Посмотреть сообщение
туториал какой-нибудь
Нет никаких туториалов. Есть очень толстые книги по стеку TCP-IP протоколов, которые должен знать каждый web-разработчик.

Цитата Сообщение от bochik Посмотреть сообщение
Вот по конкретной проблеме.
Твои проблемы и способы их решения я уже озвучивал.
Давать советы по использованию конкретной библиотеки, которую ты используешь я не собираюсь.
Тем более, что я использовал в свое время другую либу для ботов. API этой мне незнаком.

P.S. Начни давать переменными нормальные английские имена - иначе твой код никто не будет читать. Он нечитабелен.
Прочитай про правило 80 строк. Изучи PEP8 - Style Guide for Python Code.
1
1 / 1 / 1
Регистрация: 17.05.2013
Сообщений: 146
02.07.2020, 16:21  [ТС] 15
Цитата Сообщение от Garry Galler Посмотреть сообщение
Тем более, что я использовал в свое время другую либу для ботов. API этой мне незнаком
В общем огромное спасибо за помощь)))
0
02.07.2020, 16:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2020, 16:21
Помогаю со студенческими работами здесь

NameError: name 'name' is not defined
ошибка, как исправить. программа должна создавать всплывающую подсказку для кнопки line 12, in...

NameError: name 'с' is not defined
what = input( "Что делаем? (+,-): " ) a = input("Введи первое число: ") b = input("Введи второе...

NameError: name '_' is not defined
Здравствуйте! Как известно, в Python есть буферная переменная _, которая каждый раз, как...

NameError: name 'self' is not defined
class AnonymousSurvey(): """Get anonymous responses.""" def __init___(self, question):...

NameError: name 'hello' is not defined
создаю простенький файлик: def hello(): print('Hello, world!') def calc_summ(a, b):...

NameError: name 'x' is not defined
import pygame import random from os import path img_dir = path.join(path.dirname(__file__),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru