Ответы пользователя по тегу Python
  • Почему я получаю 'referenced before assignment'?

    Vindicar
    @Vindicar
    RTFM!
    Питон видит, что ты присваиваешь start_id что-то, и решает что это локальная переменная. А потом понимает, что ты выше её читаешь, и ругается. Это намеренное поведение, так как в противном случае либо:
    а) до присваивания бы читалось значение глобального start_id, а после - локального,
    б) глобальная переменная всегда изменялась бы вместо локальной, и появление новой глобальной переменной с тем же именем что и локальная где-то в функции приводило бы к её неожиданному изменению.
    И то и то неочевидно и могло бы привести к "молчаливому"(без исключений) но неправильному поведению программы.

    Если не присваивать, то локальной переменной start_id не существует, и чтение осуществляется из глобальной.

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

    Vindicar
    @Vindicar
    RTFM!
    Ответ написан
    Комментировать
  • Как сделать рассылку сообщения сразу во все каналы?

    Vindicar
    @Vindicar
    RTFM!
    Как-то так. Никаких гарантий, что дискорд не пошлёт твоего бота далеко и надолго за спам.
    @client.command()
    async def test(ctx):
        await ctx.author.send(f'test')
        # сохраняем набор и порядок каналов на случай, если он поменяется в процессе отправки.
        channels = list(ctx.guild.text_channels)
        # формируем пачку корутин, выполняющих отправку
        send_coroutines = [channel.send('test') for channel in channels]
        # планируем одновременное выполнение этих корутин и ждём завершения. 
        # Исключения будут возвращены наравне с результатами, а не выброшены.
        results = await asyncio.gather(*send_coroutines, return_exceptions=True)
        # анализируем results на предмет ошибок. 
        # Успешная отправка вернёт объект сообщения, неудачная вернет (а не выбросит!) объект исключения.
        failed = [ (ch.name, str(res)) for res, ch in zip(results, channels) if isinstance(res, (Exception, asyncio.CancelledError)) ]
        if failed: # были ошибки?
            await ctx.author.send('Failed to send to the following channels:\n' + '\n'.join(f'- {ch}: {msg}' for ch, msg in failed))
        else: # ошибок не было
            await ctx.author.send('Message has been spammed successfully.')
    Ответ написан
    Комментировать
  • Как переделать условие на python 3.10?

    Vindicar
    @Vindicar
    RTFM!
    Дело не в версии питона, а в том что у тебя для первого i в i['key'] не содержится строка "full.zip". В этом случае питон 3.9 даст точно такую же ошибку, так как первый if не отработает, а второй обратится к time_create.
    А вот почему так - уже совсем другой вопрос. Может, разные пакеты установлены на двух версиях питона. Может, просто файлы в files_dict оказываются в немного разном порядке. Я бы посоветовал починить алгоритм в целом, т.е. инициализировать time_create каким-то значением до цикла.
    Ответ написан
    3 комментария
  • Почему не работает запрос mysql?

    Vindicar
    @Vindicar
    RTFM!
    AlexSeley, засунь ошибку в автопереводчик, раз английского не знаешь.
    telebot пытается вызвать твою функцию start() с одним параметром, хотя с точки зрения питона она параметров не принимает.
    Mysql тут нипричем от слова совсем, можешь убедиться, заменив содержимое start() на pass.
    Так что вопрос "почему питон думает, что функция start() не принимает параметров".
    И вот тут уже нужен полный код бота. Оформленный как положено, а не просто копипаст.
    Ответ написан
    Комментировать
  • Ошибка при логировании в консоль после переопределения лога. Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Ну то что дважды логирует - может, потому что ты не отключил дефолтовый логгер для unicorn.
    Перенастрой журналирование так, чтобы в тексте показывалось имя логгера, будет понятнее кто и что пишет.
    Ответ написан
  • Как убрать ошибку при выведении в окно типа text из текстового файла docx?

    Vindicar
    @Vindicar
    RTFM!
    if var == 0:
    Так не сработает. Нужно
    if var.get() == 0:
    Ответ написан
    Комментировать
  • Как достать значение объекта из json?

    Vindicar
    @Vindicar
    RTFM!
    data - это словарь, а не список. Будь внимателен.
    А у словаря перебираются ключи, а не значения.
    Так что либо так:
    for key in data:
        print(data[key]["bar"])

    Либо так:
    for value in data.values():
        print(value["bar"])
    Ответ написан
  • Как максимально просто и быстро переименовать файлы по маске?

    Vindicar
    @Vindicar
    RTFM!
    1. Составляешь список интересующих тебя файлов с помощью модуля glob или pathlib.
    2. С помощью регулярного выражения "\d+" (модуль re), вытаскиваешь из имен файлов последовательности цифр. Если их несколько, тебе придётся придумать критерий, какую брать (например, последнюю). Определяешь наибольшее количество разрядов.
    3. Снова проходишься по списку имен с помощью re.sub(). Второй аргумент re.sub() может быть не только строкой для замены, но и функцией - просто делаешь функцию, которая дополняет входящую строку нулями до желаемой ширины и возвращает её.
    4. Если новая строка (с заменой) отличается от оригинальной, то переименовываешь файл с оригинальным именем в файл с новым именем, иначе оставляешь как есть.
    Ответ написан
    Комментировать
  • Как лучше хранить пути к файлам в модуле?

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

    Vindicar
    @Vindicar
    RTFM!
    discord.py не поддерживает слэш команды, посмотри в сторону dislash - она вроде спроектирована для работы совместно с discord.py.
    Либо можно посмотреть в сторону форков discord.py, типа pycord или nextcord.
    Ответ написан
    Комментировать
  • Как в If записать промежуток между 1 и 35?

    Vindicar
    @Vindicar
    RTFM!
    if 1 <= int(HP) <= 35:
        aboba()
    Ответ написан
  • Как сделать что бы участник сервера дискорд мог задать вопрос разработчику через бота discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Взять и сделать.
    Обработчик на команду (если хочешь использовать help, придётся отключить встроенный help), который посылает принятую в параметрах команды строку в заранее заданный (по ID) канал.
    Как писать обработчики команд, приведено в докуменации на discord.py. Чуть подробнее почитай, как получить строку из нескольких слов, чтобы не пришлось писать !help "у меня такой вопрос", а можно было писать !help у меня такой вопрос.
    Как получить канал - ищи в документации Client.get_channel() и описание объекта канала - PrivateChannel для прямых сообщений и GuildChannel для канала на сервере, смотря куда хочешь писать.
    В чем конкретно проблема?
    Ответ написан
  • Как сократить код?

    Vindicar
    @Vindicar
    RTFM!
    if (k.count("A") + k.count("B")) == 2:
    Ответ написан
    Комментировать
  • Обнулить значения всех инициализированных дескрипторов?

    Vindicar
    @Vindicar
    RTFM!
    Ну вообще - зачем тебе такое? Но если очень хочется...

    Ты хочешь обнулять только поля типа Price? Тогда не нужно хранить ссылки на владельцев, достаточно хранить ссылки на все экземпляры Price и присвоить им value = None или что ты там используешь как метку удалённого значения.

    Но прямо скажу, это странное решение.
    Ответ написан
    Комментировать
  • Какое решение проблемы?

    Vindicar
    @Vindicar
    RTFM!
    Оставляя за кадром удачность решения с несколькими таблицами, содержащими одинаковые данные, скажу так.
    Сначала сверяешь количество строк в таблицах, если не равно - дальше можно не смотреть, они не совпадают.
    Потом сортируешь обе таблицы по сравниваемому столбцу, и сравниваешь значения из этого столбца попарно.
    Если есть хоть одно расхождение, таблицы не совпадают.
    Ответ написан
    1 комментарий
  • Перезапуск python скрипта с определенной строки?

    Vindicar
    @Vindicar
    RTFM!
    Нет и не будет. Пример:
    a = 1
    b = 2
    print(a+b)

    Объясни, какое поведение ты ожидаешь от перезапуска скрипта с третьей строки, не выполняя первых двух.
    Ответ написан
    3 комментария
  • Наследование и переопределение, как быть?

    Vindicar
    @Vindicar
    RTFM!
    Выше LXSTVAYNE тебе хороший совет дал, а я напишу кодом.
    Описываешь базовый класс и наследуешься от него:
    class WordComparator:
        def compare(self, word1: str, word2: str) -> int:
            "Вернет -1 если первое слово лучше, 1 если второе слово лучше, 0 если они одинаково хороши"
            raise NotImplementedError #реализации у нас нет
    
    class LongestWordWins(WordComparator):
        def compare(self, word1: str, word2: str) -> int:
            l1, l2 = len(word1), len(word2)
            if l1 > l2:
                return -1
            elif l1 < l2:
                return 1
            else:
                return 0
    
    class ShortestWordWins(WordComparator):
        def compare(self, word1: str, word2: str) -> int:
            l1, l2 = len(word1), len(word2)
            if l1 > l2:
                return 1
            elif l1 < l2:
                return -1
            else:
                return 0

    Затем ты передаёшь в класс, реализующий игровую логику, экземпляр одного из двух классов, и обращаешься к его методу compare() когда тебе надо сравнить два слова.
    Это называется паттерн "стратегия".
    Ответ написан
    Комментировать
  • Почема фласк не там ищет стили и не правильно работают ссылки?

    Vindicar
    @Vindicar
    RTFM!
    Как выглядят ссылки? Относительные небось, типа "some/other/page"?
    Если да, то у меня плохие новости - они работают относительно текущего адреса.
    А если нет, то приведи пример ссылок.
    Ответ написан
    Комментировать
  • Почему в numpy берется только тонкая полоска изображения?

    Vindicar
    @Vindicar
    RTFM!
    Погоди, а что за ересь ты вообще творишь?
    im = Image.open('IMG_7760.JPG')
    a = np.asarray(im) # a - трёхмерный массив numpy (высота; ширина; каналы)
    
    for bb in a: # перебираешь элементы по первому индексу (высоте), т.е. строки изображения
        np.random.random((1,1,1)) * a #умножаешь каждый элемент (кортеж RGB) строки на одно и то же случайное число
        #и всё. Полученное произведение выбрасывается за ненадобностью. Оригинальное значение ты не заменяешь ведь.
        im = Image.fromarray(bb) #*строку* превращаешь в объект PIL.Image
        im.save('2222.JPG') #и сохраняешь этот объект в файл
        print(bb) #и выводишь на экран

    Питон делает ровно то, что ты у него просишь.
    Ответ написан