• Какие есть способы скомпилировать Python программу в исполняемый файл?

    Vindicar
    @Vindicar
    RTFM!
    Чтобы код остался питоном - никак. Питон по природе язык с виртуальной машиной, известные мне реализации питона не делают полноценную трансляцию в машинный код. Максимум JIT.
    Но можно поискать транспиляторы, вроде cython. На главной странице репозитория есть любопытный набор ссылок.
    Ответ написан
    1 комментарий
  • Пытался написать телеграмм бота с Chat GPT. В чем ошибка?

    Vindicar
    @Vindicar
    RTFM!
    ModuleNotFoundError: No module named 'urllib3.contrib.appengine'

    Stackoverflow говорит, что это косяк в последней версии requests. Создай отдельный файл и сделай в нём только import requests - отработает или нет?

    Если нет, поставь более старую версию. Если ставил через pip, то можно указать версию явно: pip install requests==x.yy.zz. Список версий можно посмотреть на pypi.
    Ответ написан
    Комментировать
  • Async, js модули, в браузере как правильно сделать синхронизацию?

    Vindicar
    @Vindicar
    RTFM!
    Это плохая идея, я тебе скажу. Асинхронный код не от хорошей жизни асинхронный - длительные операции вешают страницу, спасибо однопоточному браузерному JS.
    Так что если нужно что-то большое грузить при старте - лучше делать асинхронно, дальше использовать через callbackи, раз уж async-await не хочешь делать.
    Ответ написан
  • Как мне вывести список с экземплярами класса?

    Vindicar
    @Vindicar
    RTFM!
    В питоне есть два метода преобразования в строку: __str__() и __repr__().
    Первый преобразует объект в какую-то человекочитаемую строку. Он вызывается, если передать объект в функцию str().
    Второй обычно даёт более "техническое" представление объекта - в идеале, он показывает питоновский код, который нужно выполнить, чтобы этот объект получить. Но это требование не строгое, и никто не запрещает в __repr__() показывать что-то другое. Метод вызывается, если передать объект в функцию repr().

    Если у объекта нет __str__(), то питон попробует вызвать __repr__(). А __repr__() есть у всех объектов - он наследуется от базового object.

    Ты выводишь список целиком. У списка (list) нет метода __str__(), он использует __repr__() - и поэтому пытается вызывать repr() на твоих объектах, а repr() даже не пытается вызвать __str__(), она сразу идёт к __repr__().

    Я бы посоветовал переписать метод Deck.__str__() так:
    def __str__(self):
            return '[' + (', '.join(str(card) for card in self.mydeck)) + ']'

    Тперь он явно вызывает str() на каждой карте, а потому будет использоваться метод Card.__str__().
    Ответ написан
  • Как соединить рандомные точки на координатной плоскости в многоугольник?

    Vindicar
    @Vindicar
    RTFM!
    Твоя задача называется выпуклая оболочка - convex hull.
    Попробуй поискать по этим терминам.
    Ответ написан
    Комментировать
  • Какой командой запустить код заново в python?

    Vindicar
    @Vindicar
    RTFM!
    Почитай про цикл while и оператор break.
    Также, на будущее - не забывай оформлять код кнопкой </>.
    Чем более читаем твой вопрос и твой код, тем больше шансов получить ответ.
    Ответ написан
    Комментировать
  • Tkinter. Какой метод позиционирование лучше выбрать .pack / .place / .grid?

    Vindicar
    @Vindicar
    RTFM!
    Помести кнопки в Frame, Frame прикрути через pack(). Кнопки внутри фрейма - можно тоже через pack, можно еще как.
    Единственное, при добавлении новых элементов нужно будет сообразить, как указать, чтобы они паковались ДО фрейма с кнопками.

    EDIT: Заверни панель кнопок в ещё один Frame, и помести эту панель внутри внешнего Frame через pack(side='top', anchor='center'). Но учитывая, что у тебя в окне и так уже используется pack(side='top'), то можно обойтись без внешнего Frame - просто убери expand/fill с панели кнопок и запакуй её наверх.
    Пример кода с внешней панелью:
    import tkinter as tk
    
    
    root = tk.Tk()
    root.geometry('200x100')
    frame_outer = tk.Frame(root, bg='blue')
    frame_outer.pack(expand=True, fill='both')
    
    frame = tk.Frame(frame_outer, bg='green')
    btn1 = tk.Button(frame, text='Button1')
    btn2 = tk.Button(frame, text='Button2')
    btn1.pack(side='left', padx=5, pady=5)
    btn2.pack(side='left', padx=5, pady=5)
    frame.pack(side='top', anchor='center')
    
    root.mainloop()
    Ответ написан
    3 комментария
  • Зачем функции filter методы итератора?

    Vindicar
    @Vindicar
    RTFM!
    Ну ответ на вопрос вполне очевиден:
    class filter(object):
    Это не функция, это класс. Метод __iter__ будет принадлежать экземпляру этого класса, т.е. результат вызова filter() можно будет итерировать.
    А вот почему это класс, вопрос поинтереснее. Я подозреваю, что filter() старше, чем yield и генераторы - а без них класс был бы единственным способом реализовать нужное поведение.
    Ответ написан
    2 комментария
  • Как работает замыкание в python?

    Vindicar
    @Vindicar
    RTFM!
    Мне кажется, это деталь реализации, а потому тут надо в исходники лезть. Например, для CPython можно начать с codeobject.
    Ответ написан
    Комментировать
  • Ошибка при асинхронном запросе MYSQL?

    Vindicar
    @Vindicar
    RTFM!
    Попробуй создавать курсор на каждый запрос, а не переиспользовать один и тот же.
    Ответ написан
    3 комментария
  • Как сменить одну из переменных в отдельном файле?

    Vindicar
    @Vindicar
    RTFM!
    Что значит "изменить переменную в файле"?
    Одно дело, если файл был импортирован, и тебе нужно изменить переменную в нём. Это легко.
    import names
    names.name1 = 'Абдурахман ибн Хоттаб'

    Вот только такое изменение не сохранится в файл. Если тебя это устраивает, то вопрос закрыт.

    А если ты хочешь, чтобы оно сохранялось, то всё намного хуже, потому что ты пытаешься использовать питоновский файл как файл конфигурации. Это не дело. И ещё хуже то, что твои переменные name1, name2, name3 намекают, что тебе на самом деле нужен список.
    Тогда у тебя получится что-то такое
    # names.json
    ["Дима", "Маша", "Елена"]
    
    # main.py
    import json  # чтобы легко и удобно сохранять структуры данных в файл
    import sys  # чтобы узнать, где лежит main.py, и сохранить рядом
    from pathlib import Path  # чтобы работать с путями к файлам
    
    MAIN_PY = Path(sys.argv[0])  # путь до main.py
    MAIN_DIR = MAIN_PY.parent.resolve()  # путь до папки, где лежит main.py
    CFG = MAIN_DIR / 'names.json'  # путь до файла, куда сохраняем данные
    
    with CFG.open('rt', encoding='utf-8') as cfg:  # открываем на чтение
        names = json.load(cfg)  # читаем всё содержимое файла
    # пользуемся полученными данными - списком имён
    print(names) 
    names[0] = "Абдурахман ибн Хоттаб"
    # сохраняем список обратно
    with CFG.open('wt', encoding='utf-8') as cfg:  # открываем на запись
        json.dump(  # пишем всё содержимое списка в файл
            names,  # что будет содержимым файла
            cfg,  # в какой файл записать
            ensure_ascii=False,  # чтобы не заменял кириллицу на коды символов
            indent=2,  # чтобы были красивые отступы. Если убрать, файл будет весь в одну строку.
        )
    Ответ написан
    Комментировать
  • Как правильно организовать наследование?

    Vindicar
    @Vindicar
    RTFM!
    Не нужно мешать синхронный и асинхронный подходы в одном проекте. Если хочешь оставить синхронный код - сохрани его в отдельной ветке (ну или в отдельной папке, если не используешь контроль версий). Но в проекте ты будешь использовать либо одно, либо другое, так что смысла оставлять и то и то просто нет.
    Ответ написан
  • Flask вывод изображения из базы данных?

    Vindicar
    @Vindicar
    RTFM!
    А зачем ты делаешь data:? Не проще сделать <img src="/photo" />?
    Ну и да, ты говоришь, что у тебя есть переменная encoded_image - а где она? Ты не делаешь base64 кодирование, хотя и заявляешь, что делаешь.
    Ответ написан
    3 комментария
  • Как реализовать изменение данных анкеты в БД через inline клавиатуру в телеграм боте?

    Vindicar
    @Vindicar
    RTFM!
    1. Если пользователь должен отправлять данные как текст сообщения, тебе нужен finite state machine (FSM). В aiogram уже есть реализация, почитай и погугли примеры.
    2. Никогда не формируй SQL запросы f-строками - слишком легко ошибиться, да и небезопасно.
    Ответ написан
    Комментировать
  • Как скомпилировать файл python в exe?

    Vindicar
    @Vindicar
    RTFM!
    Убедись, что каталог, где лежит pyinstaller.exe (скорее всего каталог установки питона, подкаталог Scripts), находится в переменной окружения PATH, или указывай полный путь до него.

    И да, это не компиляция, это упаковка. Разница значительная.
    Ответ написан
  • Как вывод команды help в терминал передать в переменную?

    Vindicar
    @Vindicar
    RTFM!
    help() выводит doc-string переданного объекта. Обычно этот doc-string лежит в атрибуте __doc__.
    Так что можно сделать куда проще, чем подсовывать что-то вместо stdout:
    help_text = getattr(obj, '__doc__', None)
    В help_text будет None или строка документации.
    Ответ написан
    Комментировать
  • Как запускать и работать в разных py файлаз через тг бота?

    Vindicar
    @Vindicar
    RTFM!
    Ну один из вариантов...
    В файле-плагине должны быть функции для обработки входящих сообщений и других событий (например, начало работы файла/конец работы файла). Имена этих функций должны быть заведомо известны.
    Основной бот знает, какой файл сейчас текущий, и все обрабатываемые события пробрасывает в этот текущий файл, вызывая его функции. Дальше уже забота файла понять, что делать с очередным событием.
    Ответ написан
    Комментировать
  • Как в название одной переменной внести значение другой переменной?

    Vindicar
    @Vindicar
    RTFM!
    Это можно сделать, но в 99% случаев это не нужно делать. Во-первых, пользователь может ввести строку, которая не является корректным идентификатором. Во-вторых, появляется риск нечаянно перезаписать переменную, которую мы не хотели трогать.
    Вместо этого следует использовать словарь (dict), где ключ - имя "переменной", а значение - её содержимое. Это куда более контролируемо.
    Нет, я хочу выстрелить себе в ногу, и санитары меня не остановят!

    Функция globals() возвращает словарь глобальных переменных, а locals() - словарь локальных.
    При этом эти словари - не копии, а, можно сказать, оригиналы. Добавишь в них новый ключ - появится новая переменная. Вот пример в интерактивной консоли питона:
    Python 3.11.7 (tags/v3.11.7:fa7a6f2, Dec  4 2023, 19:24:49) [MSC v.1937 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> l = locals()
    >>> l['x'] = 1
    >>> x
    1
    >>>

    Ответ написан
    Комментировать
  • Как асинхронно создать QR код?

    Vindicar
    @Vindicar
    RTFM!
    Потому что создание QR-кода - это вычислительная операция, а не операция ввода/вывода. Вычислительные операции не имеет смысла делать асинхронными. Если создание QR-кода занимает у тебя достаточно длительное время, чтобы это было проблемой для остальной программы - засунь этот код в поток через run_in_executor(). Тогда у тебя будет асинхронный future-объект, который можно awaitить как обычно.
    Ответ написан
    4 комментария
  • Как сделать закрытие окна по названию Python на Linux и на Windows?

    Vindicar
    @Vindicar
    RTFM!
    Я тебе больше скажу, под линуксом есть несколько оконных менеджеров - Gnome, KDE, Xfce из числа популярных.
    Хотя многие менеджеры базируются на X-Server, так что любое решение, использующее базовые возможности X-Server, будет более-менее универсальным. Например, можешь попробовать команду wmctrl.
    Если я верно понял справку по ссылке выше, то
    wmctrl -c 'Имя моего окна' должно закрыть первое окно, в заголовке которого встречается подстрока "имя моего окна" без учёта регистра.
    wmctrl -F -c 'Имя моего окна' должно закрыть первое окно, заголовок которого в точности равен "Имя моего окна".
    Это сработает для Xfce и KDE X11, но не для KDE Wayland, например. Насчёт Gnome не уверен.

    А вообще стоит задаться таким вопросом: тебе нужно именно закрыть отдельное окно, или завершить процесс, который это окно породил? Потому что если второе, то под линуксом это делается намного проще и универсальнее.
    Ответ написан
    Комментировать