TGINSIGHT CHAT
Python Заметки
@pythonotes
EducationИнтересные заметки и обучающие материалы по Python Контакт: @paulwinex ⚠️ Рекламу на канале не делаю!⚠️ Хештеги для поиска: #tricks #libs #pep #basic #regex #qt #django #2to3 #source #offtop
Неодамнешни објави
Ознака: #libs · 124 објави
Објавено 30 окт.
Пока команда разрабов Python понемногу наращивает скорость работы интерпретатора, новый язык программирования Mojo с заявкой на замену Python тихо пилит свои первые релизы. Уже сейчас прирост в CPU рассчётах в 10к раз! Можно скачать и сравнить скорость, или посмотреть что пишут другие. Как по мне, это выглядит как еще одна версия интерпретатора, хотя, это и не совсем так. Похоже на тот же cython - нативная поддержка дефолтного кода Python плюс свои фишки синтасиса сверху. Всё же надежда на прорывные технологии остаётся, Подождём, увидим... Забавно, что в минимальных требованиях 8Гб оперативки😧 #libs#offtop
Објавено 23 окт.
Удобный сервис для генерации команд ffmpeg. ➡️https://alfg.dev/ffmpeg-commander/ Отлично подходит для изучения ffmpeg и для быстрых набросков команды. А так же, на заметку, python-обертка #tools#libs
Објавено 16 окт.
Почему проект Qt.py до сих пор не добавил обёртку PySide6? Данный модуль используется в DCC и смежных инструментах. А учитывая стандартны отрасли, описанные на VFX Platform в 2023м году стандартном всё еще является Qt5. Переход на Qt6 запланирован на 2024й. Скорее всего к тому времени подтянется поддержка 6й ветки (но лучше бы заранее). В своих проектах с Qt6 можете исползовать альтернативный проект qtpy, который уже поддерживает Qt6 но не поддерживает старые версии. Модуль поддерживает PyQt5, PySide2, PyQt6 и PySide6. #libs
Hashtags
Објавено 20 сеп.
Как в 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
Hashtags
Објавено 20 јул.
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.me/massonnn_yt. А так же видео версия: https://www.youtube.com/watch?v=leeC0fpAY-E&list=PLN0sMOjX-lm5Pz5EeX1rb3yilzMNT6qLM Лично я использую алхимию в связке с FastAPI и пока всё устраивает #tricks#libs
Објавено 29 апр.
Репозитори на почитать для расширения кругозора. ▫️ Большой ликбез по экосистеме Python https://github.com/brunocampos01/understanding-the-python-ecosystem ▫️Подборка самых популярных полезностей для веб разработчиков https://github.com/ml-tooling/best-of-web-python ▫️Подборка библиотек для тех кто уважает типизацию в Python https://github.com/typeddjango/awesome-python-typing #basic#libs
Објавено 23 мар.
Celery это крутой инструмент для очереди задач web-вашего приложения на Python. Но его монополию всё больше притесняет другая библиотека - dramatiq. По словам автора, эта библиотека лишена всех проблем Celery If you’ve ever had to use Celery in anger, Dramatiq could be the tool for you. Обычно далее я пишу примеры как можно быстро опробовать библиотеку. Но кода там прилично, поэтому я сделал репозиторий с примером приложения на Flask. Что реализовано в этом приложении: ▫️Засетаплен dramatiq совместо с Flask с помощью flask-dramatiq ▫️Отправка простых фоновых задач ▫️Отправка периодических cron-задач по расписанию с помощью periodiq ▫️Отмена запущенных задач с помощью dramatiq_abort ▫️Задача с отложенной проверкой результата ▫️Всё закатано в Docker, поэтому заводится с полпинка В качестве брокера используется Redis. Он стартует быстрей чем RabbitMQ и dramatiq_abort пока что поддерживает только его. Шаблонов нет, фронт максимально глуп и минималистичен. 🌎 Код смотрим здесь https://github.com/paulwinex/flamatiq Также стоит посмотреть: dramatiq_dashboard django_dramatiq #libs
Hashtags
Објавено 1 дек.
Если часто работаете с архивами, то наверняка знакомы с модулем zipfile. Нет ничего сложного добавить директорию в архив. import zipfile from pathlib import Path dir_name = '~/input_files' zip_name = '~/archive.zip' with zipfile.ZipFile(zip_name, 'w') as zip: for file in Path(dir_name).glob('**/*'): zip.write(file, file.relative_to(dir_name).as_posix()) Довольно немногословно. Но можно короче! В модуле shutil уже есть готовый метод dir_name = '~/input_files' zip_name = '~/archive' zip_file = shutil.make_archive(zip_name, 'zip', root_dir=dir_name) А что насчет распаковки? Здесь проще, даже с zipfile это одна строка zip_file = '~/archive.zip' out_dir = '~/out_dir' zipfile.ZipFile(zip_file).extractall(out_dir) Ну и тем более в shutil shutil.unpack_archive(zip_file, out_dir) В примерах не делается expanduser для краткости ▫️ В данном случае функция из shutil более универсальна, так как второй аргумент format задаёт алгоритм сжатия, от чего зависит выбор библиотеки. Если написать формат tar, то вместо zipfile будет использоваться tarfile. Поддерживаются форматы zip, tar, gztar, bztar, xztar. Но только если на текущем хосте доступны соответствующие библиотеки. ▫️ Из недостатков можно назвать невозможность запаковать просто один файл. Источником может быть только директория. Проблема легко решается, но всё же. ▫️ Интересный момент. При наличии в Python2 функции shutil.make_archive() там отсутствует shutil.unpack_archive(). А появился он только в 3.7! Не очень понятно почему, но это еще один повод переходить на Python3😊 #libs#tricks
Објавено 26 ное.
В модуле logging предусмотрен немного необычный способ форматирования строки без форматирования. logging.info('Message %s %s', arg1, arg2) На самом деле, если вы его не используете то вы делаете неправильно!⚠️ Если вам требуется указать в строке сообщения какой-либо аргумент то обычно это делается форматированием строки logging.info('New value is %s' % value) Или любой другой доступный нам способ logging.info(f'New value is {value}') logging.info(f'{value=}') Кажется, всё логично, все так делают. Но нет, это ошибка! 😫 Функция записи сообщения должна быть очень быстрой. Да, она в любом случае занимает время, но чем меньше тем лучше. И особенно, когда это сообщение не проходит по фильтру уровня логирования. Например, у меня установлен уровень WARNING и выполняется вот такой вызов logging.debug(f'Current user: {user}') Что произойдет? Сообщение не попадает под установленный уровень логирования и будет проигнорировано. Это обрабатывается сразу же первой командой в вызываемой функции debug. Но при этом форматирование строки всё равно произойдёт! И проблема не в самом форматировании, которое достаточно быстрое (даже при складывании строк через "+"), а в тех возможных действиях, которые придется вызвать для преобразования объекта user в строку. Возможно, там будет запрос в БД, разбор больших массивов данных или еще что-то не очень быстрое (или не очень умное🤪). Нам всё это придётся посчитать чтобы потом.....ничего с этим не сделать. Поэтому правильно писать так: logging.debug('Current user: %s', user) Мы просто передаём подготовленную неформатированную строку и аргументы для форматирования, это не требует вычислений. Но само форматирование и сопутствующие вызовы произойдут только в случае когда это действительно потребуется, то есть уровень сообщения попадает под условия настройки текущего логгера. #libs#tricks
Објавено 22 ное.
Модуль pythonnet позволяет интегрировать ваш код на Python с .NET приложениями. Например, запускать Python модули внутри .NET или импортировать DLL библиотеки в Python. 📖Вики по модулю 📕Урок на гитхабе 📙Пара примеров использования 📌 Пример от меня: Использование библиотеки от всем известного софта мониторинга Open Hardware Monitor. Когда его скачаете, обнаружите там библиотеку OpenHardwareMonitorLib.dll. Вот она нам и нужна! Для начала поставьте модуль pythonnet pip install pythonnet Если установка завершилась ошибкой, скорее всего ваша версия Python еще не поддерживается. Поищите WHL здесь. А потом устанавливайте так: pip install ...\2.5.2-cp39-cp39-win_amd64.whl Либо попробуйте другую версию Python. Теперь нам доступен модуль clr (Common Language Runtime) с помощью которого можно делать DLL доступными для импорта import clr from pathlib import Path clr.AddReference(str( Path('OpenHardwareMonitorLib.dll').absolute() )) Предполагается, что библиотека лежит в текущей рабочей директории Вот и всё, можно импортировать и использовать from OpenHardwareMonitor.Hardware import Computer c = Computer() c.CPUEnabled = True c.GPUEnabled = True c.RAMEnabled = True c.HDDEnabled = True c.Open() for hw in c.Hardware: print(hw.Name) c.Close() Теперь можете делать свою мониторилку ресурсов. Например вот так можно считывать данные сенсоров ... for hw in c.Hardware: hw.Update() for sensor in hw.Sensors: print(sensor.Identifier, sensor.get_Value()) ... Здесь hw.Update() нужен для обновления данных сенсоров на текущий момент, на случай если у вас бесконечный цикл опроса сенсоров. __________________ PS. Некоторые устройства для получения полной информации требуют запуска от имени администратора. Например, если видите в списке устройств некий Generic Hard Disk или запрос значения сенсора вернуло None, то это как раз тот случай. #libs
Hashtags
Објавено 8 ное.
Размышления насчет ускорений Python идут полным ходом. Прежде всего идут рассуждения о выпиливании GIL, не без участия Гвидо. Но никто не отменял ускорение выполнения задач через распараллеливание различными способами. Лично я часто использую threading и multiprocessing для массовой обработки картинок или многопоточной закачки файлов. Для фоновой очереди задач использую Celery а для высоконагруженного распределённого рендеринга у меня в арсенале RenderManager'ы Afanasy и Deadline. И тут я подумал, я так давно на этом стеке, что, вероятно, упускаю какие-то новые решения. И решил поискать что там у нас из свежего... Вы наверняка знаете что Github полон самыми разными Awesome-листами. Есть даже топик Awesome Lists с подборкой этих списков. Решил я там поискать какой-то список решений для параллельных/распределённых вычислений на Python. Нашел несколько ссылок в основном Awesome-списке по Python. Не густо 😢, список для С++ и того побольше будет. В общем, покопавшись немного в сети, нашел-таки подобный список и для Python - Parallel Processing and Multiprocessing in Python. Интересная подборка модулей, есть на что залипнуть! Вот бы кто запилил нормально на Github в awesome-parallel-computing, как это сделано в Awesome Asyncio. #libs
Hashtags
Објавено 18 окт.
Все уже успели обсудить новые фишки в Python 3.10, такие как ускорение работы базовых типов, удобная типизация и особенно новый паттерн матчинг. Только ленивый не рассказывал про паттерн матчинг! Давайте я прикинусь ленивым (но это не так😉) и не буду повторяться. Расскажу про другое нововведение. В противовес мега полезному pattern matching эта штука, на первый взгляд, имеет сомнительную полезность🧐 В Python 3.10 у типа int появился новый метод int.bit_count(). Что он делает? Возвращает количество единиц в битовом представлении числа. Что? Зачем? Почему? 😭❓😱 Это не bit_length(), возвращающий количество бит, необходимых для записи данного числа. И это не struct.calcsize("I"), возвращающий количество байт, в которые точно поместится любой int. Зачем нам количество ненулевых бит в битовом представлении? Особенно когда новый метод это просто эквивалент строки: bin(num).count("1") Цитата из слов автора. An efficient popcount would be useful for numerics, parsing binary formats, scientific applications and others. Эта функция называется Population Count (подсчёт популяции). Применяется в алгоритмах теории информации. Почитайте про Теорию Хэминга чтобы понять чуть больше чем сейчас. Если коротко, это такие алгоритмы, помогающие быстро определить схожесть или различие строк основываясь на их битовом представлении. Этим применение не ограничивается. Подсчет единиц может быть полезен при работе с битовыми картами. В Redis тоже есть подобная команда. Как считаете, это маленькая удобная функция делающая Python ближе к научному сообществу или бесполезная трата места в документации? #libs
Hashtags