TGINSIGHT CHAT
Python Заметки
@pythonotes
EducationИнтересные заметки и обучающие материалы по Python Контакт: @paulwinex ⚠️ Рекламу на канале не делаю!⚠️ Хештеги для поиска: #tricks #libs #pep #basic #regex #qt #django #2to3 #source #offtop
Неодамнешни објави
Страница 6 од 32 · 384 објави
Објавено 25 мар.
Библиотека APScheduler для управления заданиями в Python. Может запускать планировщик и задания как отдельный поток (синхронный код) и как коркутины (асинхронный код), отложенные или через интервал. Что есть в APScheduler: ▫️гибкий функционал создания задачи ▫️удобное управление созданными заданиями (pause\resume, listing, modify, reschedule) ▫️кастомизация классов библиотеки ▫️различные хранилища заданий (Memory и различные БД) ▫️интеграции в фреймворки ▫️7 вариантов планировщика Три варианта тригеров для задач: ▫️по дате с помощью datetime ▫️через интервал с помощью datetime ▫️через интервал с помощью cron и другие полезности В данный момент готовится к релизу 4я версия PS. Всегда использую вместе с FastAPI, очень рекомендую к ознакомлению. #libs
Hashtags
Објавено 8 мар.
⭐️ Поздравляю!!! ⭐️ 🌺🌼🌹🧚♀️👠🍀🎉 + бонус в коментах 😊
Објавено 4 мар.
Библиотека 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
Hashtags
Објавено 26 фев.
Когда пишешь асинхронный код нужно учитывать особенности такого подхода. Всегда требуется держать в уме, когда возвращается корутина а когда реальный результат. Между этими двумя сущностями должен быть вызов через await. Вот пример синхронного запроса в базу данных с помощь sqlalchemy. Query пишу инлайном для компактности. entities = session.execute(select(EntityModel)).scalars().all() Всё ясно и линейно. А вот он же асинхронный. result = await session.execute(select(EntityModel)) entities = result.scalars().all() Это значит что session.execute возвращает корутину, или awaitable объект. Сначала его нужно выполнить через await, тогда получишь объект с которым можно дальше работать. Не хочу сказать что это мастхэв практика, но простые асинхронные запросы тоже можно сократить до одной строки. Просто использовать скобки. entities = ( await session.execute(select(EntityModel)) ).scalars().all() На самом деле я использую такую конструкцию только в прототипах тестов или вспомогательных функциях тестов. В продакшн такое обычно не попадает. #tricks
Hashtags
Објавено 19 фев.
Новый пакеджинг для Python uv написанный на Rust от автора быстрого линтера Ruff Что нам обещают ▫️ Эпичная скорость ▫️ Легкий переход с pip и pip-tools ▫️ Отсутствие зависимостей и дистрибуция в виде одного автономного bin файла Следим, надеемся, тестируем... #libs
Hashtags
Објавено 12 фев.
rich Библиотека для нескучного принта! Добавляет в ваш терминал цвет и разные способы форматирования текста. https://github.com/willmcgugan/rich ➡️ Мой небольшой пример #libs
Hashtags
Објавено 5 фев.
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
Hashtags
Објавено 1 јан.
Поздравляю всех с 2к24! ❄️⛄️🎁🎄🐲
Објавено 27 дек.
Библиотеки для рабты с коллекциями файлов (секвенциями) ▫️ Поиск коллекций в директории ▫️ Проверка целостности ▫️ Поиск пересечений ▫️ Форматирование И другие функции ➡️ CLIQUEhttps://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]">] ➡️PYSEQhttps://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
Hashtags
Објавено 14 дек.
На днях вышел Django 5. ▫️GeneratedField Поля, которые автоматически рассчитываются по экспрешену (Database generated model field). ▫️Фасетный фильтр для админки Показывает количество элементов для каждого фильтра. ▫️Async Добавлены асинхроные функции django.contrib.auth, ORM. Ряд декораторов теперь поддерживаются асинхронными вьюшками. ▫️ORM Новые возможносте полей, такие как поддержка словарей и функций в choices, дефолтные значения на стороне БД (Database-computed default values) с аргументом db_default и другие. ▫️Шаблоны Новые возможности шаблонов, позволяющие писать меньше кода в формах. #django
Hashtags
Објавено 11 дек.
Где хранить настройки мы уже выяснили. А как вы храните на хосте юзера чувствительные и секретные данные? Занимаетесь обфускацией паролей и токенов делая защиту от дурака? Да, я тоже когда-то этим занимался😆 Правильным способом будет хранение в специальных шифрованных хранилищах, которые предпоставляет ваша ОС. Сохранённую информацию можно получить только если залогиниться под юзером. То есть мы защищены паролем текущего юзера. В каждой ОС своё решение, и удобно будет исопльзовать просплатформенные библиотеки. Самая популярная это keyring. Использовать очень просто. Любой пароль или токен сессии нужно сохранить под каким-либо именем. Обычно это имя сервиса. Так же потребуется юзернейм. С этими же данными можем получить пароль обратно. >>> import keyring keyring.set_password('myapp', 'username', 'pswd!') print(keyring.get_password('myapp', 'username')) # pswd! Поддерживается основные бэкэнды из коробки и можно доставить сторонние или написать свой. Для генерации и проверки паролей не забываем про secrets. #libs
Hashtags
Објавено 4 дек.
Библиотека platformdirs для получения стандартных локальных путей на компьютере юзера для хранения данных приложения и конфигов. ▫️кросплатформенная (Linux, macOS, Windows, Android) ▫️изоляция разных версий приложения ▫️большой список стандартных директорий Альтернативная библиотека: appdirs #libs
Hashtags