Задать вопрос
  • Как правильно распараллелить задачи?

    Vindicar
    @Vindicar
    По пока получается так, что первые две (cpu_info и system_info) работают «нормально», но потом начинает выполняться docker_info (самая долго выполняющаяся) и все остальные её всё равно ждут.


    Переформулируй, а то непонятно. У тебя первые две функции сразу отрабатывают, или же ждут третьей?
  • Почему код правильно работает только на первой викторине?

    Vindicar
    @Vindicar
    if otvet[3] == polle.option_ids[0]:
    Как именно работает поле option_ids?

    Посмотри-ка, может, у тебя бот всегда отвечает "правильно", если правильный ответ - первый в списке?
  • Как отсортировать массив экземпляров класса на Питоне?

    Vindicar
    @Vindicar
    Retr0Hacker, ну да, это отображение объектов по умолчанию.
    Если ты хочешь кастомизировать преобразование объекта в строку, определи в нём магический метод __str__(). Он должен принимать только self и возвращать строковое представление этого объекта.
  • Почему sqlite3 не сохраняет запись?

    Vindicar
    @Vindicar
    lok101, ну я бы посоветовал проверить путь к БД для начала.
    Ты используешь относительный путь, он будет зависеть от текущего каталога. Удали файл с базой данных, и тогда уже проверяй.
    Если он не будет создан - значит, итоговый путь не там, где ты думаешь.
    Если он будет создан, но будет пуст - значит, дело в запросе.
  • Где я поймал invalid syntax?

    Vindicar
    @Vindicar
    CryMafin, ну я бы полистал "Изучаем Питон" Лутца. Книжка объёмная, но это потому что он каждую тему разбирает по косточкам.
    Начни с базовых вещей. Синтаксис функций. Области видимости переменных (глобальные, локальные).
    Основные алгоритмические конструкции и типы данных. Попробуй набросать крестики-нолики в консоли.

    Потом пройдись по классам. Как создавать и удалять объекты, какие есть области видимости в классе (локальные переменные метода, атрибуты экземпляра класса, атрибуты класса, глобальные переменные). Свойства.

    Чуток поэкспериментируй с декораторами, например, попробуй написать декоратор для мемоизации (кэширование результата вызова функции). Просто чтобы освоиться с концепцией "функция - тоже объект".

    Если интересно повозиться с сетями, начала освой простой сетевой чат "один клиент - один сервер". Потом почитай про асинхронное программирование, и попробуй портировать сервер на asyncio. Получится - попробуй сделать так, чтобы сервер мог обслуживать несколько клиентов одновременно.

    Ну и по ходу дела разбирайся со стандартной библиотекой. Каждый раз, как столкнёшься с полу-тривиальной задачей типа "сравнить строку с шаблоном" или "посчитать число вхождений элементов в список", сначала поищи решение в средствах самого языка. Там много всего.
  • Попытался сделать класс, что делать?

    Vindicar
    @Vindicar
    Артём Смирнов,
    Время жизни данных о пользователе - время обработки одного сообщения. Время жизни объекта-кога - время работы скрипта-бота.
    Как следствие, тебе нет никакого смысла хранить эти переменные в атрибутах кога, они всё равно будут меняться от сообщения к сообщению, и их придётся пересоздавать. А значит, им самое место в локальных переменных в обработчике события.
  • Как удалить библиотеку с Python?

    Vindicar
    @Vindicar
    Maxwell012, нет. Либо сноси по одной, либо переставь Питон целиком.
    Вообще на будущее можешь попробовать работать с виртуальными окружениями. Их можно грохнуть и пересоздать, не трогая основную установку питона.
  • Почему перестает работать приложение на VPS после закрытия SSH?

    Vindicar
    @Vindicar
    maxemga, ну я бы вообще смотрел на третью опцию сначала. Она сложная, но зато её потом можно просто оставить как есть.
  • Как с помощью GPS и Arduino, надёжно и безопасно вывести человека из леса?

    Vindicar
    @Vindicar
    NedoKoder, есть и готовые автономные навигаторы. Если карты предзагружены, то сотовая связь нужна только для ускорения старта. Спутники GPS передают свой альманах, нужный для ориентации по ним, каждые 10-15 минут, но если есть доступ в интернет, то можно скачать актуальную версию быстрее. Это называется time to first fix.

    Ну а если речь именно про задачу, то сразу же встаёт вопрос: что значит "вывести из леса"? Вывести в ближайшую точку, которая согласно карте не является лесом? Подразумевает наличие карты с такой разметкой, и это необязательно удобно, может вывести прямо в противоположную границу от дома. А если нужно дойти до какой-то конкретной точки, это надо прикручивать экран, какой-то интерфейс пользователя для указания домашней локации...
    Ну и влаго- пыле- и температурную защищённость обеспечить, это тоже не хрен собачий. Что толку от девайса, который не работает в нужный момент.

    В общем, если ты это делаешь только как разминку для ума и рук, то так и напиши в вопросе, избежишь кучи вопросов вида "нахрена?"
    А если всерьез думаешь переплюнуть целый рынок навигационных устройств... нахрена?
  • Как создать напоминание в телеграм боте? Напоминалка каждый месяц?

    Vindicar
    @Vindicar
    PinkPonySama, ну если это единственный код в программе, то да, будет.
    Но ведь тебе нужно было его подружить с телеграм-ботом, и я советовал через aiogram.

    Асинхронный код весь исполняется в одном потоке. По сути, когда ты делаешь await, ты говоришь "выполни вот эту операцию, а пока она выполняется, посмотри, что ещё можно поделать. Как выполнится, вернёшься сюда". При этом тебе не приходится задумываться, что там у нас в очереди на выполнение, и куда нужно будет потом вернуться.
    Это удобно для приложений, ориентированных на ввод-вывод, например, на сеть. Отправил данные на вывод, или ждёшь их на вводе - а пока это всё происходит, программа может заняться чем-то ещё.
    Но в то же время, пока корутина (async функция) работает над чем-то кроме await операции, она не даст никакой другой корутине исполниться. Т.е. если пришли данные из сети, бот не сможет на них отреагировать, пока текущая корутина не уступит очередь.
    Как следствие, длинные синхронные операции (вроде time.sleep()) подвешивают асинхронную программу только в путь.
  • Как создать напоминание в телеграм боте? Напоминалка каждый месяц?

    Vindicar
    @Vindicar
    PinkPonySama, я не очень хорошо знаком с вебхуками, так что помочь тут не могу.
    Но бесконечную задачу сделать просто.
    async def inifinite_task():
        while True:
            await do_something_useful() #выполняем один цикл работы
            await asyncio.sleep(60) #спим

    Запускать её надо строго через asyncio.create_task(infinite_task()), а не через await.
    Соответственно, у тебя будет функция вида
    async def do_something_useful():
        pass # тут собственно один цикл работы
  • Как сделать, чтобы данный скрипт корректно отбирал IDы?

    Vindicar
    @Vindicar
    for i in range(99999999):
        user_id = db.check_id(i)

    Нахрена? Зачем тебе два ID у одной сущности?
  • Как заменить {} на рандом элемент?

    Vindicar
    @Vindicar
    wirflve, находить пары скобок (можно регуляркой, можно тупо через index()), вытаскивать подстроку между ними, разделять её по символу /, из полученного списка уже делать choice().
  • Как заменить {} на рандом элемент?

    Vindicar
    @Vindicar
    Замечу, что это сработает только для строки, прописанной в коде.
    Если этого достаточно, то прекрасно.
    Если же нужно получать строки из какого-то источника, то уже не прокатит.
  • Как запустить асинхронную функцию параллельно теллеграм боту?

    Vindicar
    @Vindicar
    Herben, ну так нужно головой подумать. Ну или хотя бы сначала попробовать как у меня в примере.
    Как по твоему, как быстро выполнится bot.polling()?
    Ответ

    bot.polling() будет выполняться, пока работает бот. Так как вы вызываем bot.polling() через оператор await, выполнение main() не продолжится (а значит, create_task() не выполнится), пока бот не завершит работу.


    Найди уже какой-нибудь материал по асинхронному программированию и освой его, а потом бросайся писать ботов.
  • Как запустить асинхронную функцию параллельно теллеграм боту?

    Vindicar
    @Vindicar
    Herben, нет, я имею ввиду событие "бот подключен к сети". До того, как было получено первое сообщение от пользователя, но после того, как был запущен рабочий цикл asyncio.

    Если такого события нет, то можно попробовать иначе.
    import asyncio
    
    async def main():
        # к этом момент рабочий цикл уже запущен, так как он и выполняет main()
        asyncio.create_task(.....)
        await bot.polling()
    
    if __name__ == '__main__':
        asyncio.run(main())
  • Как сделать обработчик, который обрабатывает отсутствия ответа от пользователя?

    Vindicar
    @Vindicar
    Было бы неплохо написать, как ты получаешь ответ от пользователя.
    Потому что реализация от этого зависит примерно полностью.
  • Как исправить "TypeError: tuple indices must be integers or slices, not str"?

    Vindicar
    @Vindicar
    Artem4442, я хз что ты сделал, так как код ты не приводишь, и даже БД используемую не сообщаешь, но судя по тому, что у тебя ошибка синтаксиса SQL, ты зачем-то полез в SQL запрос. Хотя речь шла об обработке значений в списке, возвращаемом fetchall(). Вот тебе один пример. Второй пример я выше привёл.
  • Как исправить "TypeError: tuple indices must be integers or slices, not str"?

    Vindicar
    @Vindicar
    Artem4442, включить голову и почитать что такое кортеж.
    А потом осознать, что нужно обращаться к полям ответа по индексу, начиная с 0. Так как ты делаешь выборку всего (SELECT *) порядок полей будет такой же, как порядок полей в таблице. Т.е. индекс 0 будет первым столбцом в таблице, индекс 1 вторым и так далее.

    Альтернативно, если используешь sqlite3, можно сразу при подключении к БД задать свою фабрику строк, тогда можно будет обращаться к столбцам и по индексам, и по именам.
    Для других БД нужно смотреть документацию, есть ли у них аналог.