Задать вопрос
  • Насколько такой метод проверки является корректным и как его можно сократить?

    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 комментария
  • Как сравнить местоположение слов в строке python?

    Dr_Elvis
    @Dr_Elvis Куратор тега Python
    В гугле забанен
    txt = "Next, use short sentences, because grandma, like anyone of us, if you make very long sentences, she gets to the end and she can't remember what you said in the beginning, anymore."
    try:
        A = txt.index("remember")
        B = txt.index("grandma")
        if int(A) - int(B) < 0:
            print('Слово A находится до слова B')
        else:
            print('Слово A находится после слова B')
    except ValueError:
        print('Не найдено как минимум одно из слов в строке')
    Ответ написан
    2 комментария
  • Как посчитать количество двойных 'X'?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    import re
    
    data = 'ZZYYXYYXZXZXZYXYYXZYZYYZYZZXYYZZXYXYZYZXYZXYZYZXZYZZZZYYZYXYXXXZYXZXYYXXYYYXXZZYYYZXZZZYXXXX'
    
    len(list(filter(lambda x: len(x)==2, re.findall('X+', data))))
    # 2
    Ответ написан
    Комментировать
  • Как найти максимальные значения элементов массива?

    @serhiops
    Python/JavaScript/C++
    Самый оптимальный вариант:
    import heapq
    a = [1, 11, 23, 41]
    largest = heapq.nlargest(2, a)   #[23,41]
    smallest =heapq.nsmallest(2, a)  #[1,11]
    Ответ написан
    Комментировать
  • Как создать профили персонажей?

    Vindicar
    @Vindicar
    RTFM!
    1. Определяешь сущности, сведения о которых нужно будет хранить: персонаж, предмет, и т.п.
    2. Определяешь сведения, которые нужно хранить о каждой из сущностей.
    2б. Определяешь способы идентификации каждой сущности - например, назначаешь порядковый номер.
    3. Определяешь связи между персонажами. Например, является ли предмет неотъемлемой частью персонажа?
    3. Осваиваешь какую-нибудь простую ORM, типа peewee или sqlalchemy. Читаешь туториалы, пробуешь написать что-то простое для начала.
    4. Описываешь сущности как модели в рамках ORM. Описываешь связи между ними.
    5. Описываешь операции (скажем, просмотр/создание/удаление персонажа) как запросы к моделям.
    6. Привязываешь операции к командам бота.

    Как-то так.
    Ответ написан
    Комментировать