TGINSIGHT CHAT
Python Заметки
@pythonotes
EducationИнтересные заметки и обучающие материалы по Python Контакт: @paulwinex ⚠️ Рекламу на канале не делаю!⚠️ Хештеги для поиска: #tricks #libs #pep #basic #regex #qt #django #2to3 #source #offtop
Неодамнешни објави
Страница 4 од 32 · 384 објави
Објавено 24 апр.
В Python 3.14 появится реализация PEP 750 и новый способ форматирования: t-strings. Это так называемые Template Strings. Синтаксис такой же как с f-strings, но форматирование происходит не сразу. Вместо строки создаётся объект Template, который внутри себя содержит исходную информацию, сырую строку (template.strings) и переменные (template.values). Это позволяет произвести дополнительную обработку данных перед форматированием, например для усиления безопасности. В примерах можно увидеть как строка с HTML кодом дополнтиельно обрабатывается чтобы избежать инъекции JS кода за счет экранирования служебных символов. Конечно, этим примером возможности не ограничивюатся. Более подробно про функционал будет понятно ближе к релизу в конце года. Сейчас доступно в сборках 3.14.0a7+ из этой ветки. Простой пример создания шаблона name = "World" template = t"Hello {name}!" Что является шорткатом для from string.templatelib import Template, Interpolation template = Template( "Hello ", Interpolation(value="World", expression="name"), "!" ) В обоих случаях объект получим идентичный print(isinstance(template, Template)) # True print(template.strings) # ("Hello ", "!") print(template.values) #(name,) Больше примеров ➡️ здесь #pep
Hashtags
Објавено 8 мар.
С праздником, девушки! 💐☀️💖
Објавено 6 фев.
Небольшая вспомогательная функция для запуска процессов. Что умеет: ▫️запускать сабпроцесс в обычном режиме с перехватом текущего терминала ▫️запускать процесс без терминала ▫️запускать детаченый процесс (никак не привязан к текущем процессу) ▫️запускать в отдельном терминале как дочерний с блокировкой, без блокировки и детаченый. ▫️передавать переменные окружения для нового процесса ▫️перенаправлять аутпут детаченого процесса в файл (полезно если он без терминала) Забираем здесь ↗️ #sources
Hashtags
Објавено 31 дек.
Всех с Новым Годом!!! ❄️🎄💥🥂⛄️ Между прочим, год питона змеи)) 🐍
Објавено 26 дек.
Pyrogram закрылся! Популярная библиотека pyrogram больше не будет развиваться. 24-го декабря мейнтейнер перевёл репозиторий в архив и написал сообщение с разъяснениями. Если вы используете pyrogram в своих проектах, то у меня для вас плохая новость. Когда в Telegram появятся новые функции или изменится API, ваш проект перестанет работать. Рекомендую оперативно его переписывать. Актуальная альтернатива - Telethon ➡️https://github.com/LonamiWebs/Telethon Документация здесь 📖https://docs.telethon.dev/en/stable/ #libs
Hashtags
Објавено 23 дек.
JSON API сейчас весьма актуален в сфере веб-приложений. Но у стандартной библиотеки json есть проблема - она относительно медленная. Если ваше веб приложение должно тянуть держать нагрузку, то такие популярные операции как сериализация и десериализация JSON хорошо бы максимально оптимизировать. Каждый запрос это преобразование JSON-строки в объект, обработка запроса, и обратное кодирование объекта в JSON-строку. Буквально - каждый! Исходные данные для теста: file = 'data.json' # 156kb with open(file, 'r') as f: file_data = f.read() data = json.loads(file_data) count = 50000 Сделаем эталонный замер стандартной библиотеки start = time.perf_counter() for i in range(count): json.loads(file_data) end = time.perf_counter() json_time_decode = end - start start = time.perf_counter() for i in range(count): json.dumps(data) end = time.perf_counter() json_time_encode = end - start print(f'Json time: {round(json_time_decode, 2)}s/{round(json_time_encode)}s') # Json time: 50.04s/40s Итак, какие есть альтернативы? Сравнивать будем с библиотеками orjson и ujson. Код находится на github, а здесь приведу только результаты. Json time: 50.04s/40s Orjson time: 20.27s [2.47x speed] / 5.46s [7.35x speed] Ujson time: 47.29s [1.06x speed] / 35.04s [1.15x speed] Неплохой прирост с orjson я считаю! А вот ujson не особо опередил. Тест проводился на Windows 10. Интересно, что на Linux ujson даже медленней чем стандартный. Но, думаю, это у меня какие-то проблемки. В тесты я не добавил simplejson. Он не сильно быстрей стандартного модуля. Если вы пишете приложения на FastAPI, то в 3 строки можете ускорить обработку JSON-ответа! Есть встроенный класс для этого. 1. Установка poetry add orjson # or pip install orjson 2. Имопрт from fastapi.responses import ORJSONResponse # Там же лежит и UJSONResponse 3. Подключение app = FastAPI( ... default_response_class=ORJSONResponse ) Для Django тоже есть решение: drf-orjson-renderer #libs
Hashtags
Објавено 16 дек.
Доделал свой старый проект - инструмент для восстановления ориентации объектов в пространстве на основе опорных компонентов. Работает в Autdesk Maya. Основные возможности. ▫️просто выделите опорные (обычно симметричные или осевые) компоненты и укажите куда их ориентировать ▫️ операции для доворотов и центрирования ▫️ восстановление исходного расположения после восстановления трансформаций ▫️работает как с одним объектом так и с группой ▫️ открытый API для интеграций с другими инструментами и автоматизаций Все действия происходят с векторами и матрицами объектов, поэтому всё достаточно быстро. Где может применяться? 🪑Нередкая проблема - собрали лейаут сцены и зафризили, или даже смержили всю геометрию в один большой меш. Требуется вернуть все объекты в "Т-позу", сохранить отдельно и расставить обратно в сцену, но с правильными трансформациями. Инструмент как раз заточен под такую работу. 🌲Заскатерили инстансы и потом конвертнули в меш. Нужно обратно преобразовать в инстансы. Здесь поможет API который восстановит положение каждого инстанса в нуле и вернёт его обратно в исходное положение, но с правильными трансформациями. Останется забрать матрицу с объекта для инстанса. Быстрое превью функционала: ▶️https://www.youtube.com/watch?v=JvlHa0NEXu8 Документация и код здесь: 🌍https://github.com/paulwinex/pw-maya-restore-orient #release#source
Објавено 3 дек.
Всех причастных с 3Dекабря! ✨😵💫💥 @offtop
Објавено 11 ное.
Как добавить директорию в игнор git репозитория. 1. Те, кто работает JetBrains-продуктах уже на автомате добавляют в .gitignore строчку: .idea/. Это самый простой способ. 2. Чтобы не добавлять в каждом проекте можно добавить в глобальный игнор файл. По умолчанию он лежит здесь: ~/.config/git/ignore Либо указать другой путь через конфиг git config --global core.excludesfile ~/.gitignore Кстати, библиотека venv в Python 3.13 по умолчанию в корень вирутального окружения добавляет файл .gitignore с одним символом *, что означает исключение всего в текущей директории. Таким образом папка с venv автоматически исключается из репозитория. Удобно. #tricks
Hashtags
Објавено 28 окт.
Что нового добавили в REPL в Python 3.13 На самом деле серьезно его прокачали! ▫️Както я писал, что для выхода из REPL приходится писать exit, еще и скобки для вызова. И было бы удобней сделать это по аналогии с обычным терминалом. Видимо, я не один такой😁 В новом REPL добавили несколько команд: exit или quit: для выхода. Именно так, без вызова функции! clear: для очистки терминала help или F1: для входа в режим справки (q для выхода) ▫️ Автокомплит по TAB аналогичный Linux-терминалу. Одиночный TAB заполняет самое пхожее совпадение, двойной показывает все доступные варианты. Эти варианты фильтруются по мере набора. ▫️ Ранее при вставке многострочного кода с пустыми строками мы получали ошибку IndentationError, теперь это исправили. Хотя, в некоторых терминалах это даже с 3.6 работает нормально, но зависит от конкретной реализации именно терминала а не Python. На винде точно не работает до 3.13. Пример кода для теста в 3.12 и 3.13 class A: def test(self): pass ▫️ История ввода теперь учитывает многосрочные команды.При нажатии стрелки вверх появятся все строки из прошлого многосрочного ввода, по ним даже можно перемещаться и редактировать. По нажатию F2 можно открыть всю историю ввода. ▫️ Колоризация кода для tracebacks и doctest. Также я заметил что имеет цвет промт функции input(). Кстати, для тестов на винде без установки можно использовать портейбл версию из проектаWinPython. #release
Hashtags
Објавено 23 окт.
А вот и наглядное использование контроля стилей через свойства виджета. Билиотека qt-material. В этом разделе написано, что через свойство class можно контролировать цвет кнопки, по аналогии с css стилями. btn_danger.setProperty('class', 'danger') btn_warning.setProperty('class', 'warning') btn_success.setProperty('class', 'success') #libs#qt
Објавено 23 окт.
Установить свойства виджета в PySide можно не только через соответствующие методы и конструктор класса. Можно их изменять с помощью метода setProperty по имени. btn = QPushButton("Click Me") btn.setProperty("flat", True) Это аналогично вызову btn.setFlat(True) Если указать несуществующее свойство, то оно просто создается btn.setProperty("btnType", "super") Получить его значение можно методом .property(name) btn_type = btn.property("btnType") Когда это может быть полезно? ▫️Можно просто хранить какие то данные в виджете и потом их доставать обратно widget = QWidget() widget.setProperty('my_data', 123) print(widget.property('my_data')) ▫️ Назначая эти свойства разным виджетам можно потом отличить виджеты во время итераци по ним. Например, найти все кнопки со свойством my_data="superbtn". Но ведь вместо кастомного свойства можно использовать objectName, будет тот же результат. Да, но y ObjectName есть ограничение - только строки. ▫️ Если нам потребуется не просто поиск а, например, сортировка по числу, то свойства позволяют нам это сделать. Поддерживается любой тип данных widget.setProperty('my_data', {'Key': 'value'}) widget.setProperty('order', 1) all_widgets.sort(key=w: w.property('order')) Но ведь Python позволяет всё вышеперечисленное сделать простым созданием атрибута у объекта widget.order = 1 widget.my_data = 123 Да, но я думаю что не надо объяснять почему не стоит так делать. К тому же, если у виджета нет свойства то метод .property(name) вернет None, а отсутствующий атрибут выбросит исключение. ▫️ Действительно полезное применение кастомным свойствам - контроль стилей. Здесь атрибутами не обойтись, нужны именно свойства. Дело в том, что в селекторах стилей можно указывать конкретные свойства виджетов на которые следует назначать стиль. Просто запустите этот код from PySide2.QtWidgets import * if __name__ == "__main__": app = QApplication([]) widget = QWidget(minimumWidth=300) layout = QVBoxLayout(widget) btn1 = QPushButton("Action 1") btn2 = QPushButton("Action 2") btn3 = QPushButton("Action 3", flat=True) layout.addWidget(btn1) layout.addWidget(btn2) layout.addWidget(btn3) # добавим кастомное свойство одной кнопке btn1.setProperty("btnType", "super") # добавляем стили widget.setStyleSheet( """ QPushButton[btnType="super"] { background-color: yellow; color: red; } QPushButton[flat="true"] { color: yellow; } """ ) widget.show() app.exec_() С помощью селектора мы избирательно назначили стили на конкретные кнопки. Как получить список всех кастомный свойств? Функция получения списка кастомных свойств отличается от получения дефолтных. def print_widget_dyn_properties(widget): for prop_name in widget.dynamicPropertyNames(): property_name = prop_name.data().decode() property_value = widget.property(property_name) print(f"{property_name}: {property_value}") #tricks#qt