Задать вопрос
  • Почему VS Code не распознает, что функция вернет tuple?

    Vindicar
    @Vindicar
    RTFM!
    Потому что оба оверлоада неразличимы - они ОБА показывают один аргумент типа bool.
    И да, а если аргумент не указан, что вернёт функция? Из твоего кода это неясно вообще, так как у тебя два противоречащих варианта.
    Тебе надо что-то типа...
    @overload
    @classmethod
    def get_mac_address(cls, with_gateway: typing.Literal[False] = False) -> str:
        ...
    @overload
    @classmethod
    def get_mac_address(cls, with_gateway: typing.Literal[True]) -> tuple[str, str]:
        ...
    @classmethod
    def get_mac_address(cls, with_gateway: bool = False) -> typing.Union[str, tuple[str, str]]:
        ...
    Ответ написан
    3 комментария
  • Ошибка PyInstaller решение?

    Vindicar
    @Vindicar
    RTFM!
    Судя по traceback, косяк в твоём модуле bottle.py. Там происходит вывод в консоль, через print(), через модуль logging, или вообще через sys.stdout.write()/sys.stderr.write().
    Ответ написан
    3 комментария
  • Как повысить скорость работы xray+reality?

    Vindicar
    @Vindicar Автор вопроса
    RTFM!
    Нашёл ещё один фактор - не зря советуют настраивать xray сервер так, чтобы рунет с него не открывался, а xray клиент - чтобы все обращения в рунет слал напрямую. Так можно спалить прокси, что приведёт к его замедлению.

    UPD 16/10/24: снёс с сервера OpenVPN по причине его окончательного отмирания - вдруг всё заработало нормально. Интересно, они как-то конфликтуют, или просто сервер трещал под постоянными попытками переподключиться?
    Ответ написан
    1 комментарий
  • Почему не работает telegram бот?

    Vindicar
    @Vindicar
    RTFM!
    @dp.message_handler()
    async def bot_message(message: types.Message):
        ...
    
    # Список для хранения значений
    values = []
    
    @dp.message_handler(lambda message: len(values) < 5)
    async def process_input(message: types.Message):
        ...


    У тебя первый же обработчик заявляет, что готов обрабатывать ВСЕ входящие сообщения. Соответственно, бот дальше и не ищет ничего. Зачем, если первый же обработчик на всё согласен?
    Освой нормальный конечный автомат (finite state machine, FSM), что ли? Есть же официальная документация, официальные примеры, только найди и прочитай...
    Ответ написан
    Комментировать
  • Почему то дискорд бот не реагрует на события on_member_remove и on_member_join?

    Vindicar
    @Vindicar
    RTFM!
    client = disnake.Client()
    Intents.members = True

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

    Vindicar
    @Vindicar
    RTFM!
    Стандартный ввод - это файл, и его технически можно "прочитать до конца". Пример:
    import sys
    for line in sys.stdin:
        print('Got', repr(line))
    print('Done')

    Запусти как обычно, введи несколько строк, а потом в терминале (если под виндой) нажми Ctrl-Z, затем Enter.
    Это пошлёт сигнал "конец файла", и дальнейшие попытки ввода через input() будут не успешными.

    Также можешь записать строки в текстовик, и запустить файл с перенаправлением ввода:
    python3 main.py < data.txt
    Тогда скрипт тоже получит сигнал о конце ввода, когда файл закончится.
    Ответ написан
    1 комментарий
  • Как интерпретировать данные в читабельный вид?

    Vindicar
    @Vindicar
    RTFM!
    У тебя request.get_json() возвращает структуру данных - просто вынимай из неё нужные поля.
    Всего-то нужно чуть-чуть почитать, как работать со словарями и списками в питоне.
    Например, data['notification_name'] вернёт название события.

    Это не единственная проблема в коде, конечно. Вот почему нельзя использовать chatgpt для написания кода, у него большие проблемы с пониманием общей структуры программы.
    Ответ написан
    3 комментария
  • При запуске бота выходит ошибка, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Если ты пытаешься парсить https://habr.com/ru/news/, то у меня плохие новости - там контент подгружается динамически, с помощью JS. Эта тема тут уже не раз обсуждалась, ищи "как парсить динамический сайт".
    Ответ написан
  • Как отправить двумерный список через aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Изучай метод str.join(), его вполне достаточно.
    Ответ написан
    Комментировать
  • Прирост в производительности после переноса алгоритма с Python на C++/C?

    Vindicar
    @Vindicar
    RTFM!
    У тебя вычисление повторяется для каждой строки? Посмотри, можно ли распараллелить код на несколько процессов (именно процессов, не потоков).
    Также посмотри насчёт использования numpy/scipy и их численных солверов для систем уравнений вместо sympy. Может, используя sympy, получится сформулировать алгоритм расчёта, а уже его портировать на numpy?

    Если надумаешь использовать numpy, держи в уме вот что: по возможности выполняй операции сразу над массивами значений. Упрощённо, вот это
    a = numpy.array([3] * 1000000, dtype=numpy.float32)
    b = 2 * a + 3

    будет намного быстрее, чем это:
    a = numpy.array([3] * 1000000, dtype=numpy.float32)
    b = numpy.zeros_like(a)
    for i in range(a.shape[0]):
        b[i] = 2 * a[i] + 3

    Причина простая - операции над массивами реализуют перебор элементов массива нативно, т.е. с той же проивзодительностью, что и C/C++/Fortran. А вот сугубо питоньи циклы - штука медленная.
    Ответ написан
  • Как добавить в базу данных два сообщения в телеграмм боте?

    Vindicar
    @Vindicar
    RTFM!
    bot.register_next_step_handler(message, impact_KEYBORD_bot)
    bot.register_next_step_handler(message, donat_user_bot)
    bot.register_next_step_handler(message, translate_message)
    bot.register_next_step_handler(message, dictionary_message)

    Так ты выбери что-то одно. У одного сообщения может быть только один next step handler. Если нужна цеполчка из более чем двух шагов, то на втором шаге ставь следующий handler, и так далее.
    Ответ написан
  • Как проверить возможность отправки сообщений пользователям?

    Vindicar
    @Vindicar
    RTFM!
    Нет. Только считать последние успешно/неуспешно отправленные сообщения.
    Ответ написан
    Комментировать
  • Как написать тг бот-секундомер на питоне?

    Vindicar
    @Vindicar
    RTFM!
    В коде дикая каша - или у тебя отступы уехали чёрт знает куда. Такое не заработает.
    Начни с официальных примеров, найди среди них наиболее похожий - скажем, вот этот таймер. Разберись, как он устроен, и потихоньку модифицируй.
    Разумеется, предполагается, что ты хотя бы насколько-то знаешь питон. Если это не так - откладываешь бота и учишь язык.
    Ответ написан
    Комментировать
  • Ошбика при запуске ТГ бота на платном сервере pythonanywhere [Errno 101]?

    Vindicar
    @Vindicar
    RTFM!
    А ты прокси их указал, proxy.server:3128? Весь доступ в сеть только через него производится.
    Бесплатные учётки к тому же могут обращаться только вот к этим сайтам.
    И да, это реально такое имя домена, оно доступно только во внутренней сети pythonanywhere.
    Ответ написан
    1 комментарий
  • Как организовать локальную разработку микросервисной системы в PyCharm?

    Vindicar
    @Vindicar Автор вопроса
    RTFM!
    Нашел один вариант - может, и не лучший, но приемлемый для учебных задач.
    1. Брокер сообщений
    Пакет kombu реализует работу с брокерами сообщений в Celery. Помимо типовых транспортов типа RabbitMQ и Redis, у него есть транспорт filesystem, причём позволяющий общаться именно разным процессам. Транспорт in-memory работает только для одного процесса. И тот, и другой транспорты не требуют отдельного брокера - они сами себе брокеры.
    На мой неопытный взгляд, потом сменить транспорт на "взрослый" будет несложно. А значит, вполне можно на эту библиотеку опираться, начиная с этапа прототипа.
    Единственное "но" - под виндой надо дополнительно поставить pywin32, kombu его сам не подтаскивает.
    2. Запуск системы
    PyCharm, оказывается, умеет создавать конфигурации запуска для нескольких скриптов.
    Нужно сначала создать конфигурации под каждый сервис в системе. Можно использовать автосозданные, а можно вручную. А затем добавить конфигурацию типа Compound, и добавить в неё компонентами нужные "одиночные" конфигурации. Они запустятся параллельно, и остановить их тоже можно все сразу. У каждого сервиса даже будет своя консоль вывода.

    Если никто не предложит варианта получше - на этом и остановлюсь.
    Ответ написан
  • Не настраиваются разные уровни логирования в python logging?

    Vindicar
    @Vindicar
    RTFM!
    Ты задал уровень WARNING для самого логгера (не для хэндлеров), поэтому он INFO отбрасывает сходу. До хэндлеров ничего не доходит просто.
    Я бы использовал эту либу немного по-другому (пример с её гитхаба)
    t_handler = tg_logger.TgLoggerHandler(users=[...], token=TELEGRAM_TOKEN)
    t_handler.setLevel(logging.WARNING)
    logger.addHandler(t_handler)

    Так куда более похоже на обычные лог-хэндлеры, проще управлять и читать даже если с либой мало знаком.
    Ну или если очень хочется setup(), то так:
    t_handler = tg_logger.setup(logger, token=token, users=users, tg_format="<b><u>%(name)s</u> : %(levelname)s</b>\n\n<code>%(message)s</code>")
    t_handler.setLevel(logging.WARNING)


    Так что логгеру задай уровень подетальнее, INFO или даже DEBUG, а тонкую настройку делай на уровне хэндлеров.
    Ответ написан
    2 комментария
  • Почему код работает, только, если замедлять сервер до 5 кадров секунду?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, как именно не работает? Комп встаёт со стола и идёт искать Сару Коннор?
    Во-вторых,
    getData = client_socket.recv(1024).decode('utf-8').split(' ')

    А если клиент не прислал данные, то сервер будет стоять и ждать на этой строке, пока хоть что-то не придёт. Хуже, recv() в общем-то не гарантирует, что данные придут одной порцией. На это можно полагаться до килобайта, но выше может быть фрагментация.
    Ну и наконец, ты сейчас пытаешься каждый кадр передавать полную информацию о происходящем в игре. Это может и надёжно, но не быстро.
    Ответ написан
    4 комментария
  • Как настроить OpenVPN для 1 устройства?

    Vindicar
    @Vindicar
    RTFM!
    Выше верно написали. OpenVPN мог бы решить такую задачу, если нап каждом устройстве был бы свой клиент openvpn.
    А так - убрать redirect-gateway, на роутере прописать статический IP "заворачиваемому" устройству, прописать в up script для openvpn добавление правил роутинга, чтобы все пакеты с "заворачиваемого" устройства роутились через VPN. В down прописать удаление этих правил.
    Если соединение стабильное и не хочется морочиться, правила можно прописать статически.
    Ответ написан
    Комментировать
  • Как сделать чтобы бот ждал какое-то время, но при этом обрабатывал запросы?

    Vindicar
    @Vindicar
    RTFM!
    asyncio.sleep() вполне хватит.
    Бот должен знать своё состояние ("покой", "сбор игроков", "игра идёт", ну и так далее).
    Один обработчик (начало игры) проверяет, что сейчас состояние "покой", отправляет приглашение, ставит состояние "сбор игроков" и ждёт заданное время. По итогам ожидания проверяет список игроков. Если нужного числа игроков в списке нет, ставит состояние "покой", иначе "игра идёт".
    Второй обработчик (игрок присоединился) проверяет, что сейчас состояние "сбор игроков". Если да, добавляет отправителя в список игроков.

    Как хранить состояние, список игроков и другую игровую инфу, зависит от того, может ли параллельно идти несколько игровых сессий. Если не может, то достаточно простых глобальных переменных. Если может... всё сложнее.
    Ответ написан
    1 комментарий