• Парсинг стоимости инвентаря Steam CS:GO?

    Vindicar
    @Vindicar
    RTFM!
    Очень странный код. А зачем ты вообще используешь create_task() и gather()?
    create_task() имеет смысл, если хочешь вызвать корутину так, чтобы она выполнялась независимо от вызывающей.
    gather() имеет смысл, если у тебя НЕСКОЛЬКО корутин, и ты хочешь выполнить их параллельно, а потом дождаться, когда все выполнятся.

    А в твоём случае должно быть достаточно
    xxx = await get_inventory(steam_id)

    Далее, зачем у тебя get_quantity() вызывается асинхронно, да еще и опять через create_task()?
    Она не выполняет никакого ввода-вывода, да и ЦПУ не особо загрузит, оставь её синхронной и вызывай как обычно.

    Далее, ты используешь в куче синхроную requests и асинхронную aiohttp. Выбери что-нибудь одно? Я бы остановился на aiohttp, раз уж аснихронный код пишешь.

    В общем, проще переписать, чем исправить...
    Ответ написан
    Комментировать
  • Как такое реализовать?

    Vindicar
    @Vindicar
    RTFM!
    Записываешь в хранилище (можно базу, можно файл) время, когда ожидание должно закончиться.
    При загрузке проверяешь наличие этой записи. Если есть, вычисляешь, сколько ждать до целевого момента (если он ещё не наступил).
    Если он уже прошел - сам решай, выполнять команду немедленно, или ждать до следующего момента.
    Так или иначе, после выполнения команды удаляешь запись из базы.
    Ответ написан
  • Мой exe файл некорректно передаётся, что делать?

    Vindicar
    @Vindicar
    RTFM!
    что значит "текстовый файл передаётся нормально"? Ты первые 2048 байт при приёме выбрасываешь же.
    Ответ написан
    2 комментария
  • Библиотека threading - обратная совместимость?

    Vindicar
    @Vindicar
    RTFM!
    Как будешь параллелить выполнение CPU-bound задач?
    Ответ написан
  • Как создать базу данных sqlite3 для всех серверов на которые есть бот discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Не проще ли включить id сервера в соответствующие таблицы?
    Т.е. у каждого пользователя будет составной id: свой id + id сервера. Аналогично с ссылками на этого пользователя.
    Потому что создавать отдельную БД на каждый сервер довольно муторно - и не очень ясно, какая от этого выгода.
    Ответ написан
    1 комментарий
  • Вопросы про нейронную сеть?

    Vindicar
    @Vindicar
    RTFM!
    Отвечу на что смогу.
    > Как посчитать нейросеть для тупого запоминания выборки?
    > Почему обучая нейросеть она может менять свой процент правильности?
    > Почему при увеличении слоев сеть порой тупеет.
    Это называется переобучение. Если очень наглядно, то это можно представить так:
    underfitting_and_overfitting_in_machine_learning_image.png
    Слева - недостаточно сложная сеть. Она не может приспособиться к сложности данных, и даёт только грубое подобие той закономерности, которую мы моделируем.
    Справа - чрезмерно сложная сеть. Она очень хорошо вписывается в обучающую выборку (точки на графики), но если ей дать промежуточные точки (т.е. те. которых не было в обучаяющей выборке), она будет давать сильно отличающиеся от реальных ответы. Это и есть "сеть зазубрила выборку" (подразумевается "вместо того, чтобы понять её закономерности").
    Твоя задача как архитектора сети - выбрать такие гиперпараметры (это то, что ты выбираешь до обучения - число слоёв, размер слоёв, скорость обучения, функция активации и т.д.), чтобы сеть не переобучалась.
    Собственно, на графике ошибки сети это как раз выглядит так:
    overfitting-and-underfitting-wrt-model-error-vs-complexity.png
    Синяя кривая - ошибка на обучающей выборке. Желтая - на контрольной. По оси X - сложность сети.
    Тогда твоё поведение объясняется так. Сложная сеть сначала быстро приспосабливается к выборке (быстро падает ошибка на обоих выборках), а потом начинает зазубривать обучающую выборку (и набирать ошибку на контрольной, так как перестаёт понимать закономерности). Если ты это наблюдаешь - сеть слишком сложная.
    Ответ написан
    Комментировать
  • Можете помочь с пониманием кода?

    Vindicar
    @Vindicar
    RTFM!
    > Я так понимаю, что должно работать как-то так:
    > @vcl.on('привет', "здравствуй")
    > def hello(text):

    Неправильно понимаешь. Это могло бы сработать, если бы ты передал
    @vcl.on(['привет', "здравствуй"]) #обрати внимание на список!
    Тогда, совместно с твоим предложением по изменению on(), сработало бы. Это один способ.

    Однако ты не обратил внимание вот на какой вариант:
    @vcl.on('привет')
    @vcl.on("здравствуй")
    def hello(text):

    Это тоже должно сработать! Список имеет смысл, если ты загружаешь этот список откуда-то, а не записываешь его как константу в коде скрипта.

    А вообще я бы посоветовал использовать регулярные выражения. Примерно так:
    import re
    #.............................................
        def on(self, condition):
            if isinstance(condition, re.Pattern):
                predicate = lambda text: condition.match(text)
            elif isinstance(condition, str):
                condition = condition.lower()
                predicate = lambda text: condition in text
            elif callable(condition):
                predicate = condition
            else:
                raise TypeError('Condition must be either string or function!')
    
            def decorator(command_func):
                self.actions.append((predicate, command_func))
                return command_func
    
            return decorator

    Для пущего удобства можно исправить метод run_command(), чтобы обработчику команды был доступен результат сопоставления.
    def run_command(self, text):
            text = text.lower()
            for predicate, command in self.actions:
                res = predicate(text) #сохраняем результат
                if res:
                    try:
                        response = command(text, res) #теперь обработчик принимает два аргумента!
                        if response is None:
                            response = "Команда выполнена"
                        else:
                            response = str(response)
                    except Exception as err:
                        response = "Ошибка при выполнении команды"
                        print(err)
                    if response:
                        m.say_message(response)
                    break
            else:
                m.say_message("Неизвестная команда")


    И пример использования будет примерно таким:
    #нужно знать синтаксис регулярных выражений
    #совпадёт с любой строкой, начинающейся строго со слов "скажи" или "произнеси"
    #всё что после этих слов попадёт в отдельную группу 1.
    @vcl.on(re.compile('^(?:скажи|произнеси) (.+)$', re.I)) 
    def hello(text, match): #все обработчики будут принимать два аргумента!
        #match будет содержать результат сопоставления входной строки с регуляркой
        #group(1) будет содержать то, что оказалось на месте (.+)
        return match.group(1) #пусть бот повторит то, что мы попросили его сказать
    Ответ написан
    Комментировать
  • Как можно ускорить код?

    Vindicar
    @Vindicar
    RTFM!
    Лобовой ответ - фоновый шум есть? Может, Recognizer его принимает за речь, и думает что ты все эти несколько минут говоришь.
    В параметрах метода listen() есть кое-что интересное, почитай.
    Ответ написан
  • Как считывать данные из базы данных в sqlite с помощью python?

    Vindicar
    @Vindicar
    RTFM!
    Потому что нужно читать документацию, там на первой же паре страниц есть примеры кода, в том числе запрос SELECT.

    Что ты вообще ожидаешь получить вызовом str(cursor.execute), если ты знаешь, что cursor.execute() - это метод?
    И почему ты игнорируешь возвращаемое им значение, когда выполняешь запрос?

    Короче, ещё раз - читай доки. Они полезные.
    for row in cursor.execute('SELECT bdname FROM user_city'):
            print(row)
    Ответ написан
    Комментировать
  • Каким модулем распознавать речь на python?

    Vindicar
    @Vindicar
    RTFM!
    Ну есть вот такой проект с открытыми исходниками, на титульной странице приведён их стек технологий.
    Ответ написан
    Комментировать
  • Почему не получается перенести текст с блока в текстовый документ?

    Vindicar
    @Vindicar
    RTFM!
    Невнимательность - мать маразма. =) Ты оба файла обозвал как f.

    f = open("skinsinfo.txt", "w")
    count = 0
    i = 0
    try:
    with open('skins.txt', 'r') as f:
    Ответ написан
  • Как сравнивать две строки, имеющий разные "шрифты"?

    Vindicar
    @Vindicar
    RTFM!
    Нормализация юникода - вещь малоприятная.
    Первый термин для гугла - гомоглиф (homoglyph), т.е. символы, которые выглядят очень похоже (типа русской и латинской о). Для питона вроде есть одноименная библиотека, но я сам с ней не работал.
    Ответ написан
    Комментировать
  • Как сделать uptime, чтобы типа таймер шёл после запуска скрипта бота и показывал сколько времени работал бот discord py?

    Vindicar
    @Vindicar
    RTFM!
    Делать постоянно тикающий счётчик неэффективно и неудобно.
    Лучше просто при запуске бота сохрани текущее время в переменную.
    Когда у тебя запрашивают аптайм (т.е. в обработчике команды !uptime), вычти из текущего времени сохраненное в переменной - получишь интервал времени между ними. Это и будет аптайм. Останется только его отформатировать красиво.
    За подробностями смотри модуль datetime, типы данных datetime и timedelta.
    Ответ написан
    Комментировать
  • Aiogram - как отправить аудио файл gTTS без сохранения на диск?

    Vindicar
    @Vindicar
    RTFM!
    Ты спрашиваешь как сохранить выхлоп gTTS в объект BytesIO, или как отправить содержимое BytesIO через телегу?
    Потому что если первое, это есть в документации на gTTS.
    Ответ написан
    1 комментарий
  • Как правильно список загрузить в базу данных MySQL через Python?

    Vindicar
    @Vindicar
    RTFM!
    Код в примере ожидает список из кортежей по два элемента.
    Список на скриншоте состоит из одиночных строк. Так что либо данные кривые, либо вы не в тот запрос их подаёте.
    Ответ написан
  • Как реализовать отправку уведомлений ботом при соблюдении условий?

    Vindicar
    @Vindicar
    RTFM!
    Еще один человек бросился писать ботов, не озаботившись изучить азы асинхронного программирования.

    Если очень коротко: пока твой код делает что угодно кроме await-вызова, остальной бот стоит.
    То есть:
    time.sleep(10) - весь бот стоит и спит 10 секунд
    await asyncio.sleep(10) - текущая корутина стоит и спит 10 секунд, но в это время могут выполняться другие корутины. Например, реакция на внешние события.

    Что это тут у нас?
    while True:
                schedule.run_pending()
                time.sleep(1)

    Мало того, что бесконечный цикл, так ещё и ожидание делаешь через time.sleep(), который про асинхронность не знает.

    И далее. А на кой овощ тебе вообще использовать schedule, если тебе требуется простое периодическое действие? Особенно с учётом того, что schedule - это тоже синхронная библиотека. Т.е. ты из асихронного бота вызывает синхронный код schedule, а потом оттуда будешь вызывать асинхронные методы отправки сообщений? Хороший способ усложнить себе жизнь!

    async def check_if_notifications_are_needed(self):
        pass
    #а ниже будет что-то типа
    async def run_check(self):
        while True:
            await self.check_if_notifications_are_needed()
            await asyncio.sleep(3600) #серьезно, зачем проверять каждые 5 секунд если достаточно раз в час?
    Ответ написан
  • Как тут сделать insert?

    Vindicar
    @Vindicar
    RTFM!
    Akina, Глеб Лукашонок, пожалуйста, не собирайте SQL запросы с помощью форматирования строк без крайней на то необходимости.

    Используйте placeholders, и да пребудет с вами Бобби Тейблз.
    cur.execute("insert into d_commands (executor, text, phis_addr) values (?, ?, ?)", (1, str(action), -1062731554))

    В этом случае экранирование будет выполнено автоматически, без риска что вы забудете это сделать.
    Ответ написан
  • При запуске бота выдает ошибку AttributeError: 'NoneType' object has no attribute 'create_task' как исправить?

    Vindicar
    @Vindicar
    RTFM!
    dp.loop.create_task(get_channels())
    На момент этого вызов диспетчер еще не начал работу, поэтому его рабочий цикл (loop) отсутствует. Я полагаю, create_task() нужно вызывать внутри какого-либо обработчика события, тогда можно быть уверенным, что рабочий цикл уже запущен.
    Если API aiogram имеет событие, срабатывающее при подключении к сети, обработчик этого события будет подходящим местом.
    Ответ написан
  • Как сделать свойство объекта используемым по умолчанию в Python как в VBA?

    Vindicar
    @Vindicar
    RTFM!
    Магические методы помогут.
    Это не "свойство по умолчанию", а скорее "определение смысла операции для данного объекта", но итоговый результат будет примерно тот же.
    Также можно использовать методы __int__(), __float__() и __complex__() чтобы прозрачно преобразовать объект в число. Но обычно __add__() сотоварищи куда практичнее.
    Ответ написан
    1 комментарий
  • Почему зависает метод put?

    Vindicar
    @Vindicar
    RTFM!
    Возможно, очередь переполнилась.
    Простой способ это обойти: ты знаешь, сколько заданий было дано дочерним процессам. Читай ответы из очереди и считай их. Когда прочитаешь столько ответов, сколько было дано заданий - можно дальше не читать.
    Ответ написан
    Комментировать