Задать вопрос
  • Как сделать музыкального бота в discord, disnake(cogs)?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Программировать и гуглить решения ошибок вы, судя по постановке вопроса, не умеете.
    Читать документацию по библиотекам не хотите или не можете.
    Экстрасенсов, чтобы угадывать, что именно "не работает" здесь нет.
    Поэтому выход один - заказывайте разработку на фрилансе.
    Ответ написан
    Комментировать
  • Хостинг телеграм бота с базой данных SQLite3, как?

    Vindicar
    @Vindicar
    RTFM!
    Расширю ответ выше для случая, если VPS под линуксом:
    0. Добавь журналирование действий в бота, это упростит отладку потом.
    1. Арендуешь VPS.
    2. Получаешь доступ по SSH.
    3. Проверяешь, какая версия питона установлена по умолчанию.
    4. Если требуется, устанавливаешь предпочительную версию питона. По возможности используй пакетный менеджер.
    5. Создаёшь каталог для своего бота. Под никсами обычно это каталог внутри /opt.
    6. Создаёшь в каталоге виртуальное окружение через venv.
    7. Активируешь это окружение и ставишь в него нужные боту пакеты через pip. Это предпочтительнее, чем ставить пакеты прямо в системное окружение.
    8. Загружаешь в каталог бота. Либо прямо с машины, используя scp, либо загрузив его куда-то ещё, и скачав через wget. Есть ещё вариант с загрузкой бота на гитхаб, но тут надо быть осторожным и не запалить токен бота и другую секретную инфу.
    9. Проверяешь, что бот работает. Рекомендуется не запускать бота из-под root. Создай новую учётную запись, и сделай chown на все файлы бота, чтобы они принадлежали этой учётке.
    10. Формулируешь и записываешь команду, которая позволит запустить бота через желаемое виртуальное окружение от имени правильной учётной записи.
    11. Разбираешься, как том дистрибутиве, под которым работает VPS, настроить автозапуск. Скорее всего это systemd, но может быть и просто скрипт в /etc/init.d или ещё что. Прописываешь автозапуск бота, например, через systemd модуль.
    12. Убеждаешься, что бот заводится через автозапуск.
    13. PROFIT.
    Ответ написан
    Комментировать
  • Какую key-value БД использовать с данными в 10 млрд строк записей?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Несколько мыслей.

    1) У меня устойчивое дежа-вю. Периодически в топик заходят люди с именно этим вопросом. Разница только в количестве. Кому 1 млрд. Кому 10. Можно также поискать и слинковать эти вопросы в один большой вопрос.

    2) MySQL который указан в тегах - нормально справляется с этой задачей. Он и не такое число строк
    умеет хранить. И если взять MariaDb - там есть куча новых engines которые можно крутить для тюнинга
    именно скорости чтения. Разумеется жертвуя чем-то другим. Транзакциями и записью например.

    3) Непонятно что такое минимальное время? Если использовать дисковую БД типа MySQL то деградация времени
    поиска будет примерно зависеть от логарифма количества строк. Тоесть деградация будет но очень медленно.
    Для 10 млрд индекс по key будет содержать порядка 4-5 уровней BTree дерева. Тоесть дисковой системе
    нужно будет сделать до 5 или до 6 рандомных чтений (если нужные данные лежат в таблице). Это достаточно
    быстро для того чтобы моргнуть глазом за это время. Рандомное чтение любого блока из магнитного диска
    класса SATA-3 занимает порядка 20 милисекунд. Тоесть для 5 уровней - это 100 милисекунд. Для дисков
    класса SSD и это время можно уже считать меньше милисекунды. Точно я не знаю надо мерять.

    Испортить это время может сетевой лаг который в данной задаче мы просто не учитываем. Считаем что сеть идеальна.

    4) Непонятно зачем здесь указан Redis. Его задача не хранить 10 млрд а хранить только горячие
    ключи по котороым идет очень частый доступ. Если автор хочет In-memory хранение - то время можно
    еще сильнее улучшить. Его можно свести практически до нуля (я вангую несколько микро-секунд)
    но придется прикупить планок памяти побольше и посчитать сколько памяти
    надо для 10 млрд key/values неизвестной длины. Вообще крутить регулятор в направлении
    микро-секунд нет особого смысла т.к. другие звенья вашего стека (приложение и сеть) могут
    быть на порядки медленнее а это вообще нивелирует всю пользу от такой оптимизации.
    Ответ написан
    41 комментарий
  • Как посмотреть тело функции в python?

    drygdryg
    @drygdryg
    Python-разработчик
    Поскольку самая популярная и эталонная реализация Python: CPython имеет открытый исходный код, вы можете найти исходники встроенных функций в репозитории с исходными кодами CPython: https://github.com/python/cpython.
    Некоторые встроенные функции написаны не на Python, а на том языке, на котором написан сам интерпретатор Python: на Си, поэтому, скорее всего, там вы не найдёте легкочитаемый исходный код функций sum, min, max и др.
    Но в случае, когда функция или любой другой объект написан на Python, посмотреть его исходный код можно с помощью inspect.getsource:
    >>> import inspect
    >>> import requests
    >>> print(inspect.getsource(requests.get))
    def get(url, params=None, **kwargs):
        r"""Sends a GET request.
    
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary, list of tuples or bytes to send
            in the query string for the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :return: :class:`Response <Response>` object
        :rtype: requests.Response
        """
    
        return request("get", url, params=params, **kwargs)

    Получить исходный код встроенной функции или метода, реализованного на Си внутри CPython, таким способом не получится:
    Попытка получить исходный код функции sum

    >>> import inspect
    >>> print(inspect.getsource(sum))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python3.10/inspect.py", line 1139, in getsource
        lines, lnum = getsourcelines(object)
      File "/usr/lib/python3.10/inspect.py", line 1121, in getsourcelines
        lines, lnum = findsource(object)
      File "/usr/lib/python3.10/inspect.py", line 940, in findsource
        file = getsourcefile(object)
      File "/usr/lib/python3.10/inspect.py", line 817, in getsourcefile
        filename = getfile(object)
      File "/usr/lib/python3.10/inspect.py", line 797, in getfile
        raise TypeError('module, class, method, function, traceback, frame, or '
    TypeError: module, class, method, function, traceback, frame, or code object was expected, got builtin_function_or_method


    Также можно использовать IPython для получения того же результата более коротким путём:
    In [1]: import requests
    
    In [2]: %psource requests.get
    def get(url, params=None, **kwargs):
        r"""Sends a GET request.
    
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary, list of tuples or bytes to send
            in the query string for the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :return: :class:`Response <Response>` object
        :rtype: requests.Response
        """
    
        return request("get", url, params=params, **kwargs)
    Ответ написан
    Комментировать
  • Почему все говорят что писать ботов это сложно?

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

    Нужно сделать несколько под-команд у команды. Напишу цепочку if-elif-else, делов то. Ой, а теперь простыня кода на пять экранов, в которой фиг чего найдёшь. Потому что нет привычки структурировать код.

    Нужно, чтобы несколько команд/событий формировали цепочку (сценарий). Например, пользователь отправил тре сообщения, первое с именем, второе с возрастом, третье с адресом. Ой, а как это сделать вообще? Не зная понятия "конечный автомат" (finite state machine, FSM), очень трудно догадаться, как тут поступить.

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

    Нужно, чтобы бот выполнил длительную задачу, и написал сообщение, когда она выполнится. Не вопрос, напишу функцию, вызову её, а сразу после отправлю сообщение. Ой, а бот не отвечает! Потому что рабочий цикл asyncio занят этой длительной операцией и не может отреагировать на поступающие данные. Нужно иметь хорошее представление о том, как работает асинхронная программа.

    Нужно добавить боту графический интерфейс - админку. Ой, а работает или интерфейс, или сам бот! Потому что нужно представлять, как устроено большинство GUI-фреймворков, и как устроена асинхронное приложение. А заодно понимать многопоточность, вопросы синхронизации действий между двумя потоками, и особенности работы с asyncio в многопоточных приложениях. Потому что одним потоком тут обойтись будет очень непросто.

    Нужно хранить данные в БД. Ой, а почему у меня проблемы при записи в БД имени пользователя? А потому что погромист собирает SQL-запрос через форматирование строк. Надо было почитать доки, чтобы наткнуться на prepared statements, они же parameterized queries.

    Нужно хранить данные в БД. Вот только данные имеют связи многие-ко-многим. Я знаю! Я буду просто добавлять или удалять столбцы в таблицу! Потому что не освоены даже азы проектирования БД. Тут уже nuff said. И да, я такое видел на этом сайте.

    Незнание средств языка и основных приемов построения алгоритмов и структур данных приводит к диким велосипедам, которые создают больше проблем, чем пользы. Особенно если к этому добавляется нежелание находить и читать документацию на фреймворк, на котором построен бот.
    Ответ написан
    2 комментария
  • Как в python создать interface?

    Vindicar
    @Vindicar
    RTFM!
    typing.Protocol играет роль интерфейса, с той поправкой, что наследоваться от него потом необязательно - главное, чтобы набор полей/методов соответствовал.

    abc.ABC - это именно абстрактный класс, он требует наследование от себя для соответствия, и часто предполагает наличие какой-то частичной реализации функциональности.

    В отличие от него, typing.Protocol обычно применяется только для описания контракта класса, но не для частичной реализации. Так как он не требует наследования, он хорошо подходит для описания структуры объекты, который мы ожидаем на входе - без жётской привязки этого объекта к нашей иерархии классов.

    "Обычно", потому что и то, и то можно использовать "не по назначению".
    Ответ написан
    9 комментариев
  • Почему выдает ошибку Shard ID None has connected to Gateway?

    Vindicar
    @Vindicar
    RTFM!
    1. Это не ошибка, это уведомление. Не видишь метку INFO?
    2. Почему ты реализуешь команды через on_message()? Класс Client вообще не очень хоршо подходит для ботов, используй класс Bot (наследник Client, умеет всё что и Client плюс еще кучу полезностей).
    3. Ты указываешь в качестве интентов Intents.default(), а команды, похоже, рассчитаны на работу на сервере. Для получение текста сообщения из сервера нужно запросить интент message_content, иначе content будет приходить только для тех сообщений, где упоминается бот, или которые посланы боту в личку.

    Короче, найди туториал получше, например, вот этот.
    Ответ написан
    Комментировать
  • Как увеличить FPS в системе?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как увеличить FPS в системе?

    Ты уже задавал этот вопрос в комментариях к предыдущему вопросу, там есть ответ:

    Основной способ стандартный -- не перерисовывать всё, если можно этого избежать.

    Нет нужды перерисовывать весь интерфейс в бэк-буфере, если ничего не изменилось кроме положения мыши. Указатель мыши вообще можно рисовать прямо во фрейм-буфере, когда он перемещается копировать маленький квадратик из бэк-буфера и рисовать стрелку в новом месте.
    Ответ написан
  • Python telegraph асинхронный upload изображений, как сделать?

    drygdryg
    @drygdryg
    Python-разработчик
    Используйте aiohttp либо httpx в качестве HTTP-клиента вместо Requests, т.к. последний не поддерживает asyncio.
    Ответ написан
    Комментировать
  • Я записываю в файл Python переменную n, а как мне теперь это файл отправить боту в Telegram?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    как мне теперь это файл отправить боту в Telegram

    1.Открыть клиент телеграмма.
    2.Открыть диалог с ботом
    3.Прикрепить файл
    4.Нажать кнопку отправить.
    Ответ написан
    Комментировать
  • Может ли api-сервер отправить 200 браузеру, и при этом продолжить выполнять вызванный браузером запрос?

    paran0id
    @paran0id
    Умный, но ленивый
    В таких случаях положено возвращать 202, и выполнять задачу асинхронно на сервере. Можно вернуть клиенту id задачи и предоставить api для проверки статуса задач по id.
    Ответ написан
    Комментировать
  • Можно ли обработать фото в дискорд боте на python?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Нельзя
    Ответ написан
    Комментировать
  • Какие решения существуют для поиска кадров в небольшую команду?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Подъëм зарплаты всегда работает.
    Ответ написан
    Комментировать
  • PyCharm, нажимаю запустить выходит ошибка, че он хочет?

    Hivemaster
    @Hivemaster
    Админ, который хочет программировать
    Прошу помочь, я с этим уже два часа вожусь

    Всего два часа. Вы бы ещё через две минуты за помощью прибежали.

    Terminated by other getupdates request; make sure that only one bot instance is running

    Впрочем, двух часов более, чем достаточно, чтобы прочитать текст ошибки.

    P.S. Надо было не только курсив и болд использовать, но и капсом написать текст вопроса.
    Ответ написан
    5 комментариев
  • Как правильно создать глобальный контейнер?

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

    В качестве примера:

    from threading import Lock
    
    class ResourceContainer:
        _instance = None
        _lock = Lock()
    
        def __new__(cls):
            with cls._lock:
                if cls._instance is None:
                    cls._instance = super().__new__(cls)
            return cls._instance
    
        def __init__(self):
            self._db_connection = None
            self._message_broker_connection = None
            self._config = {}
    
        def get_db_connection(self):
            return self._db_connection
    
        def set_db_connection(self, connection):
            self._db_connection = connection
    
        def get_message_broker_connection(self):
            return self._message_broker_connection
    
        def set_message_broker_connection(self, connection):
            self._message_broker_connection = connection
    
        def get_config(self):
            return self._config
    
        def set_config(self, config):
            self._config = config


    В этом примере создается класс ResourceContainer, который реализует синглтон-паттерн с помощью метода __new__ и мьютекса _lock. Он хранит состояние ресурсов (подключение к БД, подключение к брокеру сообщений, конфигурация) и предоставляет к ним доступ через методы get_* и set_*.

    Другие модули или функции могут получить доступ к экземпляру ResourceContainer так:

    def foo():
        container = ResourceContainer()
        db_conn = container.get_db_connection()
        # use db_conn
    
    def bar():
        container = ResourceContainer()
        config = container.get_config()
        # use config


    Обратите внимание, что каждый раз при вызове ResourceContainer() будет возвращаться один и тот же экземпляр, таким образом состояние ресурсов будет сохраняться на всем протяжении существования приложения.
    Ответ написан
    Комментировать
  • Почему тг бот обрезает сообщение?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ответ, который уже помечен галочкой, конечно же поможет решить данную конкретную проблему, но его яркий недостаток в том, что автор вопроса так и не поймёт, в чём же именно проблема состояла. А это очень важно понимать, так как с такой же проблемой можно столкнуться и в других ситуациях.

    Проблема заключается в том, что & является разделителем аргументов GET-запроса. На первом же & в тексте будет считаться, что значение параметра text закончилось, а дальше идёт следующий параметр.

    Чтобы этого не происходило, надо заменять & на %26. Пробел надо менять на +, + менять на %2B, и это далеко не всё, с чем можно столкнуться. В частности, символ # в некоторых применениях является ссылкой на якорь на странице, и http-клиент (например, браузер) не будет передавать в запросе ничего, начиная с этого символа, если его не заменить на %23.

    Чтобы это решить в данном случае, наиболее удобный способ - это передать параметры отдельным аргументом params метода requests.get, чтобы библиотека requests сама грамотно разрулила все необходимые замены. Но если это недоступно для решения какой-то другой задачи - искать как выполнить соответствующее преобразование надо по ключевым словам urlencode/urldecode.
    Ответ написан
    Комментировать
  • Как сгладить график?

    @kisaa
    Ответ написан
    Комментировать
  • Не могу авторизоваться через selenium?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Не могу авторизоваться через selenium?

    Нет, не можете.
    Ответ написан
    2 комментария