Вам рано заниматься ботами. Ваш вопрос напоминает вопрос хирурга: коллеги, а когда аппендикс удаляем, разрез надо справа или слева делать?
Рекомендую сначала поучить анатомию и физиологию (т.е. язык программирования и ООП).
Роутер сделать можно, но зачем? NAS сделать можно, но смысл делать это на таком железе?
Чтоб оно было домашним NAS, надо купить несколько весьма недешевых компонентов - тихих вентиляторов Noctua, виброгасящих подвесов для HDD, мощный бесперебойник…
Например, у меня на работе webdriver не может скачать что ему надо, а руками драйвер можно скачать. Так что бывают разные казусы.
Но в целом - поддерживаю.
Мне кажется, что переменная в классе пуля не определена, поэтому python будет искать её в глобальной области видимости.
А там она определена. И должна меняться в цикле while, получая новые значения из атрибута класса Enemy.
Но вообще-то, конечно, каша из класса и лапши варится плохо…
CteplerMarinovich, эта ошибка очень-очень популярна тут. Каждый день её спрашивают. Воспользуйтесь поиском по строке UnicodeDecodeError и вы обязательно найдете среди всего этого и ваш случай, или близкий.
Ну и вдогонку: старайтесь не использовать кириллицу в путях - не все библиотеки корректно с ней работают.
Qerriom Magnelius, вам моё предложение кажется заморочным и излишним. Ваше право. Но время на разбиение и отладку по частям парадоксальным образом будет тем меньше, чем мельче детали вы сделаете и чем больше деталей у вас будет.
Qerriom Magnelius, ну вот я вас спрошу:
В какой именно строчке приведённого кода проблема?
Вы сможете ответить? Я бы затруднился.
Возможно, какая-то из них работает не так, как вы ожидаете. Какая? :/
Потому я и предлагаю разбить всё на много маленьких функций и проверять по частям.
Можно, конечно, поступить иначе:
В дебаггер все пошагово проходить и смотреть, на каком шаге в какой переменной не то, что ожидается.
Но с этим подходом проблема в том, что много всего разом и трудно не запутаться.
Проблему надо делить. Вашу мегафункцию надо делить обязательно, это плохо, когда функция делает это и это и это и это…
Qerriom Magnelius, тогда давайте подробностей. Код есть. Но что по-вашему не так? Где именно вас не устраивает синтаксис? Почему?
Вообще по коду:
Если подумать, приведённый код можно разделить на части:
Основная функция с декоратором, который контролирует сообщения и отдает объект message остальным частям кода;
Часть кода, получающая данные, используя message
Часть кода, генерирующая имя файла
Часть кода, сохраняющая данные в файл со сгенерированным именем
Часть про отправку сообщения о работе бота
Какая-то myqr, которая принимает полученные данные
Создание нового сообщения
Открытие ранее созданного файла
Попытка отправки открытого файла (без закрытия!)
Запуск какого-то get_menu
Такое огромное количество разных функций в одной. Надо всё это разложить в разные функции, а внутри основной функции лишь сделать вызов всех этих отдельных функций с передачей из одной в другую нужных объектов.
И отлаживать каждую по-отдельности. В идеале обвесить каждую проверками типов того, что приходит, а также тестами.
Вот если всё это сделать, то можно будет относительно легко найти, где у вас проблема. Да вы и сам легко найдете.
Мысленно разгребать же груду разнообразных строк, пытаясь понять, в какой из них у вас что-то не так… увольте-с.
Mind2077, да хоть про луны Юпитера. На тэг python подписано почти 40 тыс. читателей. Не надо спамить всем им вашими траблами с ботом и ИИ. Ни кода python, ни существенных деталей, касающихся языка… при чем тут тэг python?
Qerriom Magnelius,
На вопрос «как сделать» отвечает документация и поиск в интернет.
Тут отвечают на вопросы «почему я сделал так, как в документации, а оно не работает. Поискал в интернет, вот запросы, в ответах не нашел. Что я делаю не так?»
Покажите, как вы пробовали решить проблему, приведите код попытки (пусть неудачной), опишите, как запускали, что ожидали и что получилось.
За готовыми решениями - на фриланс. В текущем виде это не вопрос, а задание. Нарушен п.5.12 Регламента.
Вообще, можно сделать в интересующем вас классе признак изменения; признак выставлять при любом изменении; экземпляры класса при создании сложить в список, и периодически перебирать этот список, проверяя признак изменения. Обнаружив признак установленным, обработать изменённый экземпляр, и сбросить признак.
Альтернативный вариант – переносить изменённые экземпляры в отдельный список, типа стека или очереди, а после обработки возвращать в общий список.
Если хранить экземпляры в словаре, а не списке, то можно при изменении экземпляра имя ключа, соответствующего измененному экземпляру, складывать в списочек «имена изменённых экземпляров», а после обработки экземпляров – убирать из этого списка.