Python Заметки
2.31K subscribers
58 photos
2 videos
2 files
212 links
Интересные заметки и обучающие материалы по Python

Контакт: @paulwinex

⚠️ Рекламу на канале не делаю!⚠️

Хештеги для поиска:
#tricks
#libs
#pep
#basic
#regex
#qt
#django
#2to3
#source
#offtop
Download Telegram
SQLAlchemy - это один из самых популярных ORM для работы с базами данных из Python.

- поддерживат все популярные базы данных
- не привязана к какому-либо фреймворку (как, например, Django ORM)
- поддерживает асинхрон
- позволяет удобно (питонично) делать довольно сложные SQL запросы

15 июля вышла первая версия из ветки 2.0 и это хорошйи повод изучить эту библиотеку если еще не начали.

Подобрал вам ресурсы для изучения:

- Вебинар и урок про новую SQLAlchemy2.0 от Mike Bayer (автор sqlalchemy и alembic ) с онлайн конференции pythonwebconf:

https://www.youtube.com/watch?v=Uym2DHnUEno

- Для тех кто на английском не очень, есть онлайн книга на руссом от https://t.iss.one/massonnn_yt.
А так же видео версия:

https://www.youtube.com/watch?v=leeC0fpAY-E&list=PLN0sMOjX-lm5Pz5EeX1rb3yilzMNT6qLM

Лично я использую алхимию в связке с FastAPI и пока всё устраивает

#tricks #libs
👍22
Как в Linux отправить картинку на печать из Python? Это можно сделать с помощью CUPS - Common Unix Printing System

▫️ Ставим зависимости

sudo apt install -y libcups2-dev python3-dev gcc

▫️ Устанавливаекм библиотеку-обертку

pip install pycups

▫️ Печатаем

import cups
# устанавливаем коннект
conn = cups.Connection()
# получаем список принтеров
printers = conn.getPrinters()
print(printers)
printer_name = list(printers.keys())[0]
# отправляем на печать
conn.printFile(printer_name, image_path, "Image Print", {})

#libs
👍8
Почему проект Qt.py до сих пор не добавил обёртку PySide6?

Данный модуль используется в DCC и смежных инструментах. А учитывая стандартны отрасли, описанные на VFX Platform в 2023м году стандартном всё еще является Qt5. Переход на Qt6 запланирован на 2024й. Скорее всего к тому времени подтянется поддержка 6й ветки (но лучше бы заранее).

В своих проектах с Qt6 можете исползовать альтернативный проект qtpy, который уже поддерживает Qt6 но не поддерживает старые версии. Модуль поддерживает PyQt5, PySide2, PyQt6 и PySide6.

#libs
👍3
Удобный сервис для генерации команд ffmpeg.
➡️ https://alfg.dev/ffmpeg-commander/

Отлично подходит для изучения ffmpeg и для быстрых набросков команды.

А так же, на заметку, python-обертка

#tools #libs
👍123🔥2
Пока команда разрабов Python понемногу наращивает скорость работы интерпретатора, новый язык программирования Mojo с заявкой на замену Python тихо пилит свои первые релизы. Уже сейчас прирост в CPU рассчётах в 10к раз! Можно скачать и сравнить скорость, или посмотреть что пишут другие.

Как по мне, это выглядит как еще одна версия интерпретатора, хотя, это и не совсем так. Похоже на тот же cython - нативная поддержка дефолтного кода Python плюс свои фишки синтасиса сверху. Всё же надежда на прорывные технологии остаётся, Подождём, увидим...

Забавно, что в минимальных требованиях 8Гб оперативки 😧

#libs #offtop
Что позволяет делать f-strings в 3.12.

▫️можно использовать одинаковые кавычки во всём выражении
▫️можно добавлять переносы для многострочного выражения
▫️можно использовать символ новой строки (эта проблема неактуальна)
>>> print(f"{"\n".join(
>>> ["1","2","3",
>>> f"{
>>> f"{2+2}"
>>> *(2+2)
>>> }"
>>> ]
>>> )}")
1
2
3
4444

#tricks #libs
👍12
Если вы занимаетесь веб разработкой то знаете, что для оформления UI принято использовать шрифтовые иконки.
Самые популярные наборы это, конечно же, FontAwesome и MaterialDesign

Было бы здорово иметь подобный функционал в PySide? Думаю, что да!
И, как вы уже поняли, есть подходящая библиотека🙀

https://github.com/spyder-ide/qtawesome

▫️добавление любых иконок из популярных наборов иконок
▫️выбор цвета иконки
▫️изменение цвета для активного виджета
▫️поддержка анимации
▫️создание видежта иконки

Пример создания иконки

import qtawesome as qta
icon = qta.icon('fa5.flag')


#libs
👍7
Awesome Python Typing

Коллекця ссылок на различные инструменты повышения качества кода и удобства работы.
Типизация, линтинг, автокомплиты и другие полезности.

Есть ссылка на надавно вышедшую SQLAlchemy2, так что актуальность поддерживается.

Странно что всё еще нет в списке Ruff. Хотя, в Issues уже добавили запрос. Но автор не уверен что эта тулза подходит для его списка.

#libs
👍4
Библиотека platformdirs для получения стандартных локальных путей на компьютере юзера для хранения данных приложения и конфигов.

▫️кросплатформенная (Linux, macOS, Windows, Android)
▫️изоляция разных версий приложения
▫️большой список стандартных директорий

Альтернативная библиотека: appdirs

#libs
👍8
Где хранить настройки мы уже выяснили. А как вы храните на хосте юзера чувствительные и секретные данные?

Занимаетесь обфускацией паролей и токенов делая защиту от дурака? Да, я тоже когда-то этим занимался😆

Правильным способом будет хранение в специальных шифрованных хранилищах, которые предпоставляет ваша ОС.
Сохранённую информацию можно получить только если залогиниться под юзером. То есть мы защищены паролем текущего юзера.

В каждой ОС своё решение, и удобно будет исопльзовать просплатформенные библиотеки. Самая популярная это keyring.

Использовать очень просто. Любой пароль или токен сессии нужно сохранить под каким-либо именем. Обычно это имя сервиса. Так же потребуется юзернейм.
С этими же данными можем получить пароль обратно.

>>> import keyring
keyring.set_password('myapp', 'username', 'pswd!')
print(keyring.get_password('myapp', 'username'))
# pswd!


Поддерживается основные бэкэнды из коробки и можно доставить сторонние или написать свой.

Для генерации и проверки паролей не забываем про secrets.

#libs
👍53
Библиотеки для рабты с коллекциями файлов (секвенциями)

▫️ Поиск коллекций в директории
▫️ Проверка целостности
▫️ Поиск пересечений
▫️ Форматирование
И другие функции

➡️ CLIQUE https://clique.readthedocs.io/en/stable/
import clique
files = [
'/tmp/file1_001.png',
'/tmp/file1_002.png',
'/tmp/file1_003.png',
'/tmp/file1_005.png',
]
collection = clique.assemble(files)[0][0]
collection.head
# '/tmp/file1_'
collection.tail
# '.png'
collection.padding
# 3
collection.indexes
# <SortedSet "[1, 2, 3, 5]">
collection.holes()
# <Collection "/tmp/file1_%03d.png [4]">
collection.separate()
# [<Collection "/tmp/file1_%03d.png [1-3]">,
# <Collection "/tmp/file1_%03d.png [5]">]


➡️ PYSEQ https://pyseq.rsgalloway.com/
import pyseq
files = [
'/tmp/file1_001.png',
'/tmp/file1_002.png',
'/tmp/file1_003.png',
'/tmp/file1_005.png',
]
sequence = pyseq.Sequence(files)
sequence.head()
# 'file1_'
sequence.tail()
# '.png'
sequence.path()
# '/tmp/file1_1-5.png'
sequence.frames()
# [1, 2, 3, 5]
sequence.format('%p')
# '%03d'
sequence.missing()
# [4]


У библиотек схожий функционал но в деталях различается.
clique не умеет работать с pathlib.Path а pyseq не понимает генератор как источник. Но обе могут найти все коллекции в директории и выдать много информации о них.

#libs
👍101
PEP471 добавил в Python3.5 в модуль os новую функцию scandir()

▫️это генератор с соответствующими возможностями
▫️возвращает не просто строку а объект DirEntry
▫️работает в 4-10 раз быстрей чем os.listdir и os.walk

Раньше это была отдельная библиотека, которая позже стала частью CPython, как и ряд других новых библиотек в Python 3.

В настоящий момент метод Path.iterdir() всё еще использует os.listdir().
Обёртка, заставляющая обычную функцию работать как генератор

def iterdir(self):
for name in os.listdir(self):
yield self._make_child_relpath(name)


В тоже время Path.glob() и Path.rglob() уже используют os.scandir(), то есть полноценные генераторы.

#libs
👍8🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
rich

Библиотека для нескучного принта!
Добавляет в ваш терминал цвет и разные способы форматирования текста.

https://github.com/willmcgugan/rich

➡️ Мой небольшой пример

#libs
👍10
Новый пакеджинг для Python uv написанный на Rust от автора быстрого линтера Ruff

Что нам обещают

▫️ Эпичная скорость
▫️ Легкий переход с pip и pip-tools
▫️ Отсутствие зависимостей и дистрибуция в виде одного автономного bin файла

Следим, надеемся, тестируем...

#libs
🔥9🤔1
Библиотека psutil предоставляет весьма широкий инструментарий для взаимодействия с процессами.
Одна из полезных функций - узнать какие файлы открыты в контексте процесса или узнать какой процесс занимает файл.

Узнаём какие файлы использует процесс

import psutil
def list_file_handlers(process_name):
for proc in psutil.process_iter():
if proc.name().lower().startswith(process_name):
for file in proc.open_files():
print(file)
list_file_handlers('python')

Функция вернёт имя процесса который занял файл. Если файл не занят то вернёт None.

def who_is_use(fpath):
for proc in psutil.process_iter():
for item in proc.open_files():
if fpath == item.path:
return proc.name()


Для использования требуются админские права.

#libs
6👍4
Библиотека APScheduler для управления заданиями в Python.
Может запускать планировщик и задания как отдельный поток (синхронный код) и как коркутины (асинхронный код), отложенные или через интервал.

Что есть в APScheduler:

▫️гибкий функционал создания задачи
▫️удобное управление созданными заданиями (pause\resume, listing, modify, reschedule)
▫️кастомизация классов библиотеки
▫️различные хранилища заданий (Memory и различные БД)
▫️интеграции в фреймворки
▫️7 вариантов планировщика

Три варианта тригеров для задач:

▫️по дате с помощью datetime
▫️через интервал с помощью datetime
▫️через интервал с помощью cron

и другие полезности

В данный момент готовится к релизу 4я версия

PS. Всегда использую вместе с FastAPI, очень рекомендую к ознакомлению.

#libs
🔥4👍2
POSIX (Portable Operating System Interface) — это набор стандартов, определяющих интерфейсы для обеспечения совместимости между операционными системами.
Данный стандарт поддерживается всеми UNIX-системами (GNU/Linux, macOS, FreeBSD, OpenBSD и другие). А вот в Windows либо частично, либо через подсистемы (такие как WSL).

Помимо прочих условий, один из важных моментов этого стандарта - правила синтаксического анализа строк, разбиение на токены.

В Python разбиением строки на токены занимается функция shlex.split(), которая имеет один важный аргумент - posix.
Этот аргумент определяет, следует ли функции использовать правила синтаксического анализа соответствующие стандарту POSIX, или использовать обратно совместимый, легаси режим.

▫️posix=True

В POSIX-совместимом режиме функция shlex.split() будет учитывать переменную окружения IFS (Internal Field Separator) для определения разделителей полей и будет более строго следовать стандарту POSIX. Из строки удаляются неэкранированные кавычки и обратные слеши.

▫️posix=False

В легаси режиме используется более старый способ разбиения строк на токены, который будет игнорировать переменную окружения IFS и использовать whitespaces как разделители полей.

Теперь смотрим некоторые примеры.
import shlex
# кавычки
text = r'"Do"Not"Separate" \"This\"'
shlex.split(text, posix=False)
# ['"Do"', 'Not"Separate"', '\\"This\\"']
shlex.split(text, posix=True)
# ['DoNotSeparate', '"This"']

# специсимволы
text = r'A\tB\nС\fD\vE'
shlex.split(text, posix=False)
# ['A\\tB\\nС\\fD\\vE']
shlex.split(text, posix=True)
# ['AtBnСfDvE']

# обратный слеш
text = r"cmd.exe c:\games\mario.exe"
shlex.split(text, posix=False)
# ['cmd.exe', 'c:\\games\\mario.exe']
shlex.split(text, posix=True)
# ['cmd.exe', 'c:gamesmario.exe']

Учитвая, что аргумент posix по умолчанию True, стоит помнить этот факт при обработке строк с Windows-путями!

Рекомендую самостоятельно поэксперементировать с этим аргументом!

#libs
👍71
Unofficial Windows Binaries for Python Extension Packages - известная страница с множеством скомпилированных python-библиотек для Windows. Её вёл Christoph Gohlke и любезно нам собирал whl пакеты. Очень часто эа страница помогала и мне и, вероятно, многим из вас.

В июне 2022 года из-за отсутствия финансирования проект был закрыт и обновления долго не выходили. Позже и страница была удалена😭

В начале 2023 года Christoph Gohlke создал репозитории на GitHub которые заменили этот "сервис". На его странице в самом верху можно найти несколько ссылок на эти репозитории.

В частности репозиторий Pymol-open-source wheels for Python on Windows. Не могу сказать что это уже полноценная замена, кажется новые библиотеки добавляются неспеша, но это уже что-то. Активность можете проследить самостоятельно.

А еще там есть эксперементальные сборки для ARM64.

PS. Если знаете где есть подобные архивы, поделитесь в коментах.

#libs
🔥3
Когда требуется быстро расшарить файлы в локальную сеть со своего компа можно использовать дефолтный python-сервер. Все решается одной командой.

python3 -m http.server


Но это бывает неудобным если нужно скачать папку или залить файлы. В этом случае более удобным будет быстрый FTP сервер.

Я себе сделал шорткат для поднятия простого FTP сервера без авторизации на базе библиотеки pyftpdlib.

Варианты запуска:

# на рандомном порту read only
python3 -m pyftpdlib

# на указанном порту
python3 -m pyftpdlib -p 22222

# с доступом на запись
python3 -m pyftpdlib -w

# с авторизацией
python3 -m pyftpdlib -w --user=name --password=123

# полный список аргументолв
python3 -m pyftpdlib -h


Мой алиас для расшаривания в текущей директории

alias ftp="python3 -m pyftpdlib -w -p 22222"


Теперь можно подключть FTP соединение как удалённую директорию стандартными средствами OS. В Windows это Add Network Location, в Linux - зависит от дистрибутива. Ищите в разделе Network вашего файлового браузера.
Также можно использовать сторонние клиенты, например FileZilla.

А здесь подробней про http.server

#libs #tricks
🔥12👏2👍1
А вот и наглядное использование контроля стилей через свойства виджета. Билиотека qt-material.

В этом разделе написано, что через свойство class можно контролировать цвет кнопки, по аналогии с css стилями.

btn_danger.setProperty('class', 'danger')
btn_warning.setProperty('class', 'warning')
btn_success.setProperty('class', 'success')


#libs #qt
👍3🔥2
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
🔥64👍2