Задать вопрос
  • Что будет быстрее при парсинге API aiohttp или requests?

    shurshur
    @shurshur
    Смотря как напишешь. Теоретически, aiohttp может хорошо оптимизироваться за счёт асинхронности, если правильно использовать. Но если использовать неправильно и вызывать запросы в aiohttp последовательно, то за счёт более сложной магии с eventloop он потенциально потратит чуть больше миллисиекунд.

    Но я бы советовал плясать с другой стороны. В чём задача? Насколько быстро надо получить результат? В целом, если там, допустим, 100 тыс. страниц (я от балды, ничего не утверждаю), то с 0.1 с на страницу выйдет три часа на "скачать всё". Так что если задача первично всё выгрузить и затем только ловить обновления, то может быть проще вообще не заморачиваться. Я неоднократно парсил всякие сайтики, и обычно меня не парило, если это работало часами и даже сутками.
  • Как получить доступ к публичному контейнеру S3 Selectel?

    shurshur
    @shurshur
    А policy настроены на анонимное скачивание в этом бакете? По умолчанию S3 обычно предполагает, что только авторизованный пользователь может полуить файл.
  • Как исправить TypeError: Object of type Button is not JSON serializable?

    shurshur
    @shurshur
    Кустик Мей, ну, не удивлюсь, если автор какой-нить француз или итальянец?

    Есть такая опенсурсная штука OCS Inventory, веб-сайт на perl с переменными и комментариями на французском, попытки разобраться в его коде весьма доставляют...

    В общем, чем ещё помочь я не знаю. Если бы мне самому очень надо было и не было бы альтернатив, то я бы начал отладку самой библиотеки. Но это такое себе удовольстве и кучу времени потребует...
  • Как исправить TypeError: Object of type Button is not JSON serializable?

    shurshur
    @shurshur
    Кустик Мей, кстати, а точно в декораторе параметр aliase а не alias или aliases? И точно ли надо сочетать декораторы @bot.command и Андрей Ульдин.slash?
  • Как исправить TypeError: Object of type Button is not JSON serializable?

    shurshur
    @shurshur
    Кустик Мей, ну вот комментировать не знаю как.

    Все эти надстройки над discord.py фактически добавляют в стандартные классы библиотеки кастомные функции, которые, конечно, должны были бы всё учитывать, но не факт, что делают это хорошо и во всех нюансах. Особенно если добавить несколько таких разных обёрток, которые ещё и до кучи существование друг друга не учитывают.
  • Как исправить TypeError: Object of type Button is not JSON serializable?

    shurshur
    @shurshur
    Кустик Мей, ну вот можно попытаться понять, чем эти два кода отличаются. Может, разница всё же есть? Например, в одном есть discord_slash, а в другом обычные классические команды?
  • Чем отличается обычная установка от cli?

    shurshur
    @shurshur
    AlexNew22, ещё советую обратить внимание на комментарий к вопросу: pug-cli в инструкции предлагают установить глобально (с ключом -g), pug - локально для текущего проекта. Полагаю, самому проекту нужен pug, а pug-cli нужно только разработчику для разработки проекта, и в готовом проекте, вероятно, не требуется.
  • Неправильно работает анти-флуд в боте телеграм, что делать?

    shurshur
    @shurshur
    ch1ps01, суть в том, что если не использовать треды, то любые операции выполняются по очереди. Например, если команда /start выполняется 10 секунд, то любой нажавший /start в боте блокирует на 10 секунд любую его деятельность. В частности, второй нажавший /start пользователь будет ждать эти 10 секунд реакции бота.

    В приведённом куске кода запускается бесконечный цикл while, который никогда сам не завершится и не вернёт скрипт к выполнению других частей кода.

    Решения есть.

    Во-первых, можно использовать треды. Тред (thread - нить) - это как будто бы отдельный процесс, но это "недопроцесс", он выполняется в контексте той же программы и имеет доступ ко всей её памяти. Если запустить бесконечный цикл в отдельном треде, то он не будет мешать основному коду программы или другим тредам выполняться. (У Python есть с тредами известная особенность, которую можно и полезно для своего развития погуглить по словам global interpreter lock, но GIL влияет в основном на вычислительные алгоритмы, а боты в основном спят в ожидании событий, на них это практически не влияет).

    В результате можно вынести задачу обновления счётчиков в отдельный тред, который будет время от времени их сбрасывать.

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

    (Дальше будет "в-третьих", но пока побольше про asyncio)

    Кроме ввода-вывода, программа может ожидать звершения асинхронных (async def) функций. В чём суть? Если функция описана как async def func, а потом мы сделали x = func(), то программа не будет ждать завершения func() - она продолжит работать дальше. При этом в x будет лежать не готовое значение выполнения функции, а так называемый future result. Его можно как угодно передавать в другие функции, возвращать, собирать future в массивы итд итп. Но когда потребуется реальный результат, нужно будет сделать final_value_of_x = await x, и программа уснёт, пока func() не завершится.

    Можно будет делать "псевдотреды": запустить в цикле несколько func(), а потом начать по очереди await на их результаты (для удобства для этого даже есть готовая функция asyncio.gather). Но, в отличие от тредов, тут переключение не может происходить когда угодно. Только в момент ввода-вывода и ожиданий (await) асинхронных функций, а точнее в момент передаи управления циклу событий (event loop).

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

    Например, пусть есть такая функция:

    async def func():
        for i in range(10):
            time.sleep(1)


    Тут нет никаких вводов-выводов, нет явных или неявных обращений к asyncio. Поэтому как только начнётся реальное выполнение этой функции, цикл событий не будет все 10 секунд выполнения функции выполняться. Это, конечно, не дело. Поэтому у asyncio есть свой аналог sleep:

    async def func():
        for i in range(10):
            await asyncio.sleep(1)


    Функция asyncio.sleep на самом деле не спит, а сразу же возвращает управление циклу событий, позволяя в это время выполнять другие ожидающие задачи (и уж если их нет - тогда уже спать по-настоящему). Когда пройдёт указанное время, цикл событий вернёт выполнение уснувшей функции. В итоге функция будет спать, но программа продолжит выполняться.

    Наконец, если вызвать asyncio.sleep(0), то программа спать не будет, но будет принудительное возвращение в цикл событий. Это используют, чтобы куски синхронного кода с долгим выполнением (например, сложные вычисления) могли иногда позволять переключаться программе в другие задачи в цикле событий. Например:

    async def func():
        for i in range(10):
            time.sleep(1)
            await asyncio.sleep(0)


    Тут не будет хорошего и быстрого переключения в цикл событий, но хотя бы будут окошки между периодами сна в 1 секунду (это пример для иллюстрации, а не для подражания).

    Асинхронщина очень популярна для разного рода ботов, сайтов, API-сервисов итд итп, потому что позволет довольно эффективно начать выполнять запрос другого пользователя, пока запрос предыдущего ещё не завершился. Собственно, нагруженные боты могут порой не оень справляться нагрузкой, несмотря даже на наличие свободных ресурсов, и asyncio им в этом помогает.

    В-третьих, на самом деле к задаче можно подойти более творчески и вообще отказаться от каких-то там циклов! Дело в том, что реально необязательно очищать счётчики сразу как прошлё оговоренное время. Достаточно очищать их перед очередным использованием. Например, можно список из времени последних 5 сообщений каждого пользователя, а во время проверки антифлуда пробегаться по массиву и из каждого списка удалять все времена старше нужного периода (например, старше минуты). И пусть даже список будет часто содержать какое-то старьё (например, кто-то в полночь написал сообщение, а очистка его случилась в 7 утра, когда первый проснувшийся что-то написал), важно, что мы это количество используем только после очистки и всякое старьё не используем в расчёт.
  • Как исправить TypeError: Object of type Button is not JSON serializable?

    shurshur
    @shurshur
    Добро пожаловать в дивный новый мир :) Библиотека discord.py не развивается, застыла на версии 1.7.3, и не умеет отправлять кнопки в embed (а для отправки она должна из объекта embed сформировать json запроса к серверам Discord). У меня тоже были адовые глюки при попытке скрестить discord.py, discord_slash и discord-components. Чёта валилось в недрах, и фиг поймёшь как решать.

    Что делать?

    Во-первых, перейти на форки так и не выпущенного discord.py 2.0 (до сих пор доступного в авторском git), такие как disnake, nextcord, pycord (не знаю, какой сейчас лучше, по состоянию на конец прошлого года disnake был лучше всех, nextcord вполне ничего, а pycord сильно отставал по адаптации фич, но вроде как активно развивался).

    Во-вторых, после первого пункта можно отказаться от discord_slash, так как новые версии библиотек поддерживают декоратор @bot.slash_command сами.

    В-третьих, новые библиотеки умеют и сами поддерживать интерактивные компоненты. Как, впрочем, мог и discord.py 2.0.

    Я в итоге для бота, которого писал, смог сделать и /команды, и меню с кнопками средствами только библиотеки disnake.
  • Как вывести пинг VK API?

    shurshur
    @shurshur
    Nikolay1133, сейас делается так:

    time.time() типа float
    минус
    event.timestamp типа str

    Как вычитать из float строку никто не знает, и python тоже :) Потому он и жалуется.

    Самое простое - это event.timestamp привести к типу float. Как приводить - советую таки разобраться самостоятельно - это вот очень тривиально. Толку писать сложных ботов без знания самых основ нет.
  • Як настроъти WOL на мікротік через NO-IP?

    shurshur
    @shurshur
    Makos_HD, нормы РУССКОГО языка ты точно не соблюдаешь. Можешь задавать на украинском вопросы на своих украинских сайтах, это не запрещено.
  • Проблема с ноутбуком?

    shurshur
    @shurshur
    HP_Pavilion_Laptop_15, превзойти вопрос будет сложно :)
  • Aiogram бот засыпает, как решить данную проблему?

    shurshur
    @shurshur
    sed -i 's#// НИКОГДА НЕ ЗАСЫПАЕТ, ЧТО БЫ НЕ БЫЛО ТУТ#import time\nwhile True:time.sleep(1)#' yourbot.py
  • Python. Редактирование host файл?

    shurshur
    @shurshur
    Александр Московщук, чтобы вызвать внешний процесс, надо вызвать внешний процесс. Увы.
  • Почему значение len(списка) не меняется в range?

    shurshur
    @shurshur
    Для понимания того, как работает range:

    >>> r=range(0,10,2)
    >>> r
    range(0, 10, 2)
    >>> type(r)
    <class 'range'>
    >>> i=iter(r)
    >>> i
    <range_iterator object at 0x7fc4143b8390>
    >>> type(i)
    <class 'range_iterator'>
    >>> next(i)
    0
    >>> next(i)
    2
    >>> next(i)
    4
    >>> next(i)
    6
    >>> next(i)
    8
    >>> next(i)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
  • Как настроить select menu?

    shurshur
    @shurshur
    LxneSamurai, зачем? Он сам поддерживает команды.
  • Есть ли сервис с API для организации хранения общедоступной информации и закрытой?

    shurshur
    @shurshur
    Ринат Бакиев, да, WP вполне может подойти для некоторых сценариев. Да, я знаю, что это решение можно посчитать довольно странным. Но вопрос ещё более странный, чем такое решение. Что за данные? Какого формата? Какой их объём? Что с ними будет делаться? Сколько будет запросов? Сколько пользователй? И ещё много других вопросов.
  • За сколько реально стать Jr ASP.NET Developer?

    shurshur
    @shurshur
    - Учитель, через сколько я смогу достичь нирваны?
    - Ну, лет через 10.
    - А если я буду ОЧЕНЬ стараться?
    - Тогда лет через 20.
  • Как проверить n-количество или они образуют последовательность Фибоначчи?

    shurshur
    @shurshur
    Не понял вопроса. Есть последовательность и надо проверить её на фиббоначиевость? Ну так отсортировать и циклом пройтись с проверкой, что s[i]+s[i+1]=s[i+2].
  • Почему выдаёт ошибку с мемами?

    shurshur
    @shurshur
    Авторизацию не проходит. Или с токенами беда, или реддит прямо забанил за какую-то не ту активность.