Задать вопрос
  • Как облачно запускать программы?

    Держи компьютер включеным и плати за свет
    Ответ написан
    5 комментариев
  • Как лучше сверстать такой блок?

    mizutsune
    @mizutsune
    I will live forever in the flame of your eyes.
    Ответ написан
    Комментировать
  • Как сделать, чтобы бот ставил автоматически реакцию на новые сообщения?

    Alexandre888
    @Alexandre888 Куратор тега discord.js
    Javascript-разработчик
    и что вызывает затруднения? вы не можете сверить ID двух разных каналов?
    client.on("messageCreate", message => {
      if (message.channel.id === "ID_канала") {
        await message.react("✅");
      }
    });

    на любое сообщение, отправленное в канал с ID "ID_канала", будет автоматически ставится реакция ✅.
    Ответ написан
    2 комментария
  • Как ограничить ресурсы бота (ОЗУ) в discord на python?

    @deliro
    Лимиты теоретически ограничить можно, но практически - не нужно. 1.5 гб для ботика - это овердофига (если только он не обрабатывает десятки тысяч пользователей одновременно). Особенно если он асинхронный (запущен в одном процессе). Правильно - лечить проблему, а не её симптомы. Профилируй, почему у тебя бот столько жрёт. Вероятно, где-то что-то течёт. Плюс в питоне вагон способов уменьшить нагрузку на память от элементарного __slots__ до генераторов и Сишных библиотек

    Ну и как сказал mayton2019, после оптимизации, если это не спасает, нужно начинать горизонтально масштабировать нагрузку.

    Тупо ограничить память - это просто шанс того, что придёт OOM Killer (или его аналог) и прибьёт твоё приложение, когда оно этого не ожидает. Да, есть инструменты, например, в golang, чтобы ограничить потребление памяти, но все они делают ровно одну вещь: управляют параметрами запуска сборщика __мусора__ (то есть, памяти, которая НЕ НУЖНА). На секундочку, протёкшая память не определяется как мусор, ровно как и не является мусором НУЖНАЯ память. Её никакие оптимизаторы не сожмут никакой магией.

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

    @Razumov_Timur_from_KZN
    Написать свою функцию сортировки
    Ответ написан
    Комментировать
  • Правильно ли я понял когда ставятся круглые ,а когда квадратные скобки?

    Списки в квадратных.
    Словари в фигурных.
    Аргументы у функций в круглых.
    Кортежи в круглых.
    Обращение к элементу списка/словаря/кортежа в квадратных.
    Ну и конечно группировка арифметических операций, как и в математике, в круглых.

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

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Может я не понимаю задумки, но в чем проблема отправить сообщение для каждого юзера отдельно?
    И да, судя по тому, что вы добавляете синхронную функцию в асинхронного бота, притом функцию которая фактически блокирует выполнение кода, вам бы основы подтянуть - до ботов вам еще далеко.
    Ответ написан
    Комментировать
  • Насколько такой метод проверки является корректным и как его можно сократить?

    Vindicar
    @Vindicar
    RTFM!
    1. Не надо проверять в рантайме type(m) == int. Достаточно указать в заголовке функции
    def add_time(self, h: int = 0, m: int = 0, d: int = 0, dw: int = 0, mh: int = 0, y: int = 0):

    Этого будет достаточно, чтобы IDE/статический анализатор сказал программисту "эй, ты фигню передаёшь в этот метод". Да, это не будет контролироваться во время выполнения, но тут уже другой вопрос: если клиент-программист сделал класс, неотличимый от int, стоит ему позволить этот класс передать вместо int. Ответственность будет на нём.

    2. Ну для конкретно твоей проверки по значению можно просто:
    if any(v < 0 for v in [h,m,d,dw,mh,y]):
        raise ValueError()

    Если хочешь красиво, можно и выпендриться:
    args = {'h':h, 'm':m, 'd':d, 'dw':dw, 'mh':mh, 'y':y}
    bad = list(filter(lambda k: args[k] < 0, args.keys()))
    if bad:
        raise ValueError('Invalid values for: ' + ','.join(bad))


    Ну а при большом желании можно и целый велосипед для декларативной проверки параметров замутить.
    Но смысл?
    import functools
    import inspect
    
    # пусть чек-функция имеет вид (value) -> bool, и возвращает True для "хороших" значений. Пример:
    def not_whitespace(s: str) -> bool:
        'String must not contain only whitespace'  # док строка будет использоваться в сообщении об ошибке
        return bool(s.strip())  # проверяем что строка не состоит из одних пробелов.
    # чек-функции можно генерировать и на ходу:
    def in_range(low, high):
        def check(value):
            return (low is None or low <= value) and (high is None or value <= high)
        check.__doc__ = f'Value must be between {low} and {high}.'
        return check
    # теперь сделаем декоратор, который умеет принимать чек-функции и применять их перед вызовом цели
    def check(**checks):
        def wrapper(func):
            sign = inspect.signature(func)
            names = list(sign.parameters.keys())  # имена параметров по порядку
            not_found = set(checks.keys()) - set(names)  # все ли чеки ссылаются на известные параметры?
            if not_found:
                # у нас есть чек на неизвестный параметр!
                raise NameError(', '.join(not_found))
            # всё ок, делаем обёртку над функцией
            
            @functools.wraps(func)
            def wrapped(*args, **kwargs):
                bad = []
                for param_name, check_func in checks.items():
                    idx = names.index(param_name)
                    if idx < len(args):
                        # параметр был передан через args
                        value = args[idx]
                        if not check_func(value):  # вызываем чек-функцию
                            err = getattr(check_func, '__doc__', '')
                            if err:
                                bad.append(f'{param_name} ({err})')
                            else:
                                bad.append(param_name)
                    else:
                        pass  # могут быть хитрости с kwargs-only параметрами. Тут уж извини, мне влом писать.
                if bad:  # нашли ошибки?
                    raise ValueError('Bad value for parameters: '+', '.join(bad))
                    # тут ещё можно помудрить над скрытием последнего фрейма в traceback, но мне опять влом
                else:  # не нашли, вызываем функцию
                    return func(*args, **kwargs)
            
            return wrapped
        return wrapper
    
    # пример использования
    # строка должна быть не из одних пробелов
    # число должно быть в пределах от 1 до 10 включительно
    @check(s=not_whitespace, n=in_range(1, 10))
    def repeat(s: str, n: int) -> str:
        return s * n
    
    print(repeat('test ', 3))
    
    try:
        print(repeat('test ', 20))
    except ValueError as err:
        print('yep! it failed!', err)
    
    try:
        print(repeat('test ', -1))
    except ValueError as err:
        print('yep! it failed!', err)
    
    try:
        print(repeat('    ', 5))
    except ValueError as err:
        print('yep! it failed!', err)
    
    try:
        print(repeat('    ', 15))
    except ValueError as err:
        print('yep! it failed!', err)
    Ответ написан
    3 комментария
  • OS desktop для слабого VPS (512Ram 5Gb)?

    ValdikSS
    @ValdikSS
    https://notes.valdikss.org.ru/linux-for-old-pc-fro...
    https://www.linux.org.ru/gallery/workplaces/16862790
    На фотографии представлен веб-браузер Qutebrowser с 7 открытыми вкладками, в режиме работы с QtWebkit. Как видно, даже с 7 вкладками (2 из которых ­— страницы Википедии с большим количеством картинок) браузер потребляет около 140 мегабайт, что позволяет комфортно сёрфить интернет на смешных 512 МБ RAM.
    Из других браузеров, до сих пор поддерживающих QtWebkit, можно отметить Otter Browser и KDE’шный Konqueror, который дополнительно поддерживает еще и KHTML (3 движка в одном браузере), но в Debian собран только с WebEngine. Первый в репозиториях Debian не присутствует.
    Браузер Seamonkey, актуальная версия которого построена на базе движка из Firefox 60, работает более-менее сносно, но не блестяще — рендерит дольше QtWebkit’а примерно в 2-3 раза, потребляет заметно больше памяти, зато работает со всеми современными сайтами. Можно использовать в качестве запасного варианта, когда QtWebkit не справляется.
    Ответ написан
    3 комментария
  • Как сделать приветствие discord.py?

    @P3r13cT
    1) Получаешь объект канала, куда хочешь отправить сообщение. Для этого можешь воспользоватся методами клиента.
    2) Вызываешь метод channel.send(content=""), где channel это канал, а внутри кавычек сообщение, которое хочешь отправить
    А вообще, согласен с ответом от fenrir, стоит подучить язык, перед тем как идти бота делать. В ином случае придётся читать одновременно документацию и discord.py, и самого питона (и уметь её читать, что, видимо, проблематично)
    Ответ написан
    Комментировать
  • Ошибка Disnake.py, кто поможет?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же английским по белому написали: у объекта класса ApplicationCommandInteraction нет атрибута message. Если залезть в доки, его и впрямь нет. А ты зачем-то дергаешь inter.message.author. Если тебе нужен отправитель команды, то у объекта inter есть такое поле author. Почитай по ссылке.
    Ответ написан
    4 комментария
  • При использовании multiprocessing может ли одновременное считывание из файлов тормозить программу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Непонятно что ты там переименовываешь. CSV файлы - это файлы последовательного доступа. И чтобы изменить 1 строчку и 1 значение тебе надо создать копию файла с изменением. И оригинал убить. В этом кардинальное отличие от баз данных где файлы имеют блочную структуру и изменнеие касается всегоа 1 db-block (обычно кусочек файла кратный 4-8 килобайт).

    Вот предлагаю обсудить этот вопрос а уже потом подойти к ... муль-ти-про-цессингу или как ты там написал.
    Ответ написан
    2 комментария
  • Как сложить время, которое у меня в переменной форматом 00:00:00?

    @FOUREX
    import datetime
    
    
    total_time = datetime.timedelta()
    lst = ["00:33:33", "00:23:34", "01:32:21"]
    
    for time in lst:
        hours, minutes, seconds = time.split(":")
        hours, minutes, seconds = int(hours), int(minutes), int(seconds)
        total_time += datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds)
    
    print(total_time)
    Ответ написан
    Комментировать
  • Как написать бота, который будет отсылать сообщения других пользователей?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Вариант 1:
    • Изучить основы языка
    • Изучить документацию
    • Научиться гуглить
    • Написать

    Вариант 2: Отправиться на фриланс
    Ответ написан
    Комментировать
  • Возможно ли связать два python приложения?

    Dr_Elvis
    @Dr_Elvis Куратор тега Python
    В гугле забанен
    2 комментария
  • Как сделать чтобы бот telegramm отправлял сообщения с discord сервера (сервер ds не мой)?

    @xxxtested
    Если дискорд сервер не Ваш, то для получения сообщений можно использовать self-bot библиотеку discum
    https://github.com/Merubokkusu/Discord-S.C.U.M
    Пример: https://github.com/Merubokkusu/Discord-S.C.U.M/blo...
    Ответ написан
    1 комментарий
  • Подойдёт ли Python для астрологического веб-сервиса?

    Alexeytur
    @Alexeytur
    Подойдет, модуль random ведь есть)
    Ответ написан
    Комментировать
  • Как правильно записать переменные в функции?

    Vindicar
    @Vindicar
    RTFM!
    В discord.py не слишеом сложные правила разбора строки с командой.
    1. По умолчанию одно слово интерпретируется как один параметр.
    async def command(ctx, a: str, b: str, c:str)
    !command раз два три
    a, b, c == "раз", "два", "три"


    2. Если часть вводимой команды заключена в кавычки, то она интерпретируется как один параметр.
    async def command(ctx, a: str, b: str)
    !command "раз два" три
    a, b == "раз два", "три"


    3. Если последний параметр отмечен как "все позиционные аргументы" (*args), то все последующие слова попадают в него как отдельные элементы.
    async def command(ctx, a: str, *b: str)
    !command раз два три
    a, b == "раз", ("два", "три")


    4. Если последний параметр обозначен как "только ключевое слово" (..., *, param), то остаток строки подаётся в него как есть.
    async def command(ctx, a: str, *, b: str)
    !command раз два три
    a, b == "раз", "два три"


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

    EDIT: ниже напомнили, что есть слэш-команды. Посмотри их!
    Ответ написан
    2 комментария