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