gram news
Аватар канала Python Заметки

Python Заметки

@pythonotes

Интересные заметки и обучающие материалы по Python Контакт: @paulwinex ⚠️ Рекламу на канале не делаю!⚠️ Хештеги для поиска: #tricks #libs #pep #basic #regex #qt #django #2to3 #source #offtop

2,200подписчиков

Открыть канал

Последние посты

  • Python Заметки

    21 сент., 09:03

    ­ WebAssembly это мощная технология позволяющая загружать практически любое приложение в браузер. Это специально собранный бинарник .wasm (не dll и не so) который одинаково запустится в браузере на любой ос.✅ Что то дает:▫️Скорость работы. В данный момент лидером по совместимости является Rust, а значит вы можете написать сложное приложение не на JS а сразу на Rust и встроить это в страницу сайта. На wasm работают различные графические и видеоредакторы где скорость выполнения важна! Например Figma. ▫️Портирование приложений ранее недоступных в браузере. Например вот вам браузерная сборка ffmpeg ▫️Выполнения тяжелого кода на стороне клиента. Это важная возможность! Вместо того, чтобы грузить свой бэкенд тяжелыми расчетам, недоступными в JS приложениями, мы просто переносим это на сторону юзера. Каждый клиент загружает своё железо.😎 Ну и конечно же есть сборка Python для wasm, это
  • Python Заметки

    17 авг., 09:01

    Не так давно столкнулся с API который в ответе с ошибкой присылал только статус-код. Без подробностей и текста ошибки. Неудобно когда нет явного описания что произошло, но вот такой сервис достался 😐Чтобы сообщение совсем не было пустым хотелось бы показывать хоть что-то, например стандартный текст ошибок соответствующего кода. В стандартных библиотеках текст статус-кодов можно достать из модуля http.from http import HTTPStatusHTTPStatus(404).phrase # 'Not Found' HTTPStatus(201).phrase # 'Created' HTTPStatus(418).phrase # "I'm a Teapot"#libs 🫖
    Python documentationhttp — HTTP modulesSource code: Lib/http/__init__.py http is a package that collects several modules for working with the HyperText Transfer Protocol: http.client is a low-level HTTP protocol client; for high-level U...
    567721Открыть в Telegram
  • Python Заметки

    20 июл., 08:59

    У меня основная ОС это Linux. Но нередко требуется делать сборку клиента под Windows. Собираю обычно через Pynstaller/Nuitka. И вот этапы борьбы поиска удобного решения.▫️ Dual Boot Пока был дуалбут, я перезагружался в Windows, копировал исходники и запускал сборку. Рабочий вариант, но времени занимает слишком уж много. К тому же дуалбута давно нет.▫️ VirtualBox Если нет дуалбута, то выручает VirtualBox. Тут стало проще, я расшарил папку с проектом в Windows как сетевой диск. Просто запускаю готовый скрипт сборки и готово. Файл сохраняется сразу на место. Но горький опыт заставил делать шару ReadOnly, что требует сначала копировать проект на локальный диск в виртуалку и только потом запускать сборку. После чего перебрасывать результат. В общем, тоже так себе вариант 😖Ясное дело, что эти два способа достаточно наивны и никакой автоматики. Поэтому пошли далее...▫️ Wine Выглядит
    GitHubGitHub - paulwinex/build-win-appContribute to paulwinex/build-win-app development by creating an account on GitHub.
    6666211Открыть в Telegram
  • Python Заметки

    13 июл., 08:59

    В прошлый раз был пример с понижением привелегий процесса. Проблема в том, что обратно поднять привилегии нельзя. Чтобы не потерять уровень доступа текущего процесса, нужно выполнять понижение в дочернем процессе. Для этого можно использовать os.fork().# example.py from pathlib import Path import os import sys import pwddef example(username): # получаем pwd юзера по имени try: pw_record = pwd.getpwnam(username) except KeyError: raise Exception(f"User {username} not found") return # создаем форк процесса pid = os.fork() if pid == 0: # если мы в дочернем процессе - сбрасываем привилегии
    Python documentationos — Miscellaneous operating system interfacesSource code: Lib/os.py This module provides a portable way of using operating system dependent functionality. If you just want to read or write a file see open(), if you want to manipulate paths, s...
  • Python Заметки

    6 июл., 08:59

    Модуль pwd может использоваться для считывания информации о пользователях из базы данных паролей Unix (обычно /etc/passwd ).Получить объект текущего юзера можно так: import pwduser_pwd = pwd.getpwnam(username)Теперь нам доступны основные данные из файла passwd print('ID:', f'{user_pwd.pw_uid}:{user_pwd.pw_gid}') print('HOME:', user_pwd.pw_dir) print('Shell:', user_pwd.pw_shell)Когда это может быть полезно?▫️ Проверка наличия юзера в системе по имени def user_exists(username): try: pwd.getpwnam(username) return True except KeyError:
    Python documentationpwd — The password databaseThis module provides access to the Unix user account and password database. It is available on all Unix versions. Availability: Unix, not WASI, not iOS. Password database entries are reported as a ...
  • Python Заметки

    22 июн., 09:04

    Недавно я реализовал Multi Tenancy систему на FastAPI + SQLAlchemy и пересобрал её в небольшой демо проект.Ключевые особенности: ▫️ Основной всего является сущность Компании. Юзеры могут подключаться к разным компаниям, но в один момент времени могут находиться только в одной (по условиям ТЗ). ▫️ Разделение данных через FK-ссылку всех ключевых бизнес-сущностей на ID компании. ▫️ ID компании задаётся при логине и хранится в JWT. При смене компании потребуется новый токен. ▫️ Контекст активируется через зависимость. ▫️ Фильтр применяется автоматически для любого запроса.Теперь подробней:1️⃣ Логин Когда юзер логинится, он указывает ID компании. Этот ID зашивается в JWT.2️⃣ Запрос Ключевое действие находится в функции get_current_user(...). Мы парсим JWT и достаем инфу о юзере и компании. Для текущей и дочерних корутин этого запроса объявляется контекст конкретной компании.
  • Python Заметки

    15 июн., 08:59изменён

    Multi Tenancy - это архитектурный подход в разработке, при котором один экземпляр приложения обслуживает множество разных клиентов так, что они имеют доступ только строго к своим данным. Например, сервис для обслуживания компании, ведения проектов, изолированных воркспейсов и тд. Наверняка вы использовали такие в работе. От простого почтового сервера до CMS.Зайдя в одно окружение, юзер уверен что, увидит только свои данные. При этом физически все используют один и тот же хост и один процесс приложения, и часто одну и ту же базу данных.Плюсы такой архитектуры: ✅ юзеры использую одну и ту же инфраструктуру, то есть легче её поддержка. ✅ не нужно держать инфраструктуру активной для юзеров, которые не пользуются приложением. ✅ возможность связывать данные между клиентами (при определенных условиях). ✅ возможность хранить общие данные.Минусы: ❌ Очевидно - сложность реализации. Плюс разн
  • Python Заметки

    1 июн., 09:01изменён

    В Python 3.6 был полностью переработан стандартный dict. Вместо разреженной таблицы данные стали храниться в плотных массивах. Это дало буст к скорости и экономию памяти. И, как сайд эффект, ключи стали упорядочены. В каком порядке добавляешь ключи, в таком можно и забрать.Но при этом OrderedDict никуда не делся. Это сделано для совместимости?Нет, между dict и OrderedDict всё ещё большая разница.▫️ При сравнении в обычном dict проверяется только наличие ключа, а в OrderedDict проверяется их порядок ▫️OrderedDict основан на связном списке и имеет метод move_to_end() для изменения порядка элементов. А метод popitem() позволяет удалять элемент как с конца так и из начала. ▫️OrderedDict это кастомный класс. Он не так оптимизирован как обычный dict. Работает дольше, места занимает больше.В версии 3.7 он был переписан на С и стал быстрей, но всё еще уступает обычному dict.Немного
    Python documentationcollections — Container datatypesSource code: Lib/collections/__init__.py This module implements specialized container datatypes providing alternatives to Python’s general purpose built-in containers, dict, list, set, and tuple.,,...
  • Python Заметки

    25 мая, 09:05изменён

    Как-то давно писал трансфер файлов по сети. В этом проекте требовалось создавать файл, который сразу существует на диске, имеет нужный размер но еще не содержит данных. Вот примеры как создать такой файл:length = 1024 1024 1024 100 with open(file_path, "wb") as out: out.seek(length-1) out.write(b"\0") with open(file_path, "wb") as out: out.truncate(1024 1024 1024 120) truncate -s 100M testФайл создается моментально и получается полностью состоящий из нулей. Более того, он не занимает место над диске! Это называется sparse files - разреженные файлы. На таких файловых системах как ext4, XFS, Btrfs, ZFS файл автоматически становится разреженным если процесс пишет за пределы конца файла. В структуре файла создаются "дырки" которые автоматически при чтении вернут нули.Если запустить тоже самое на Windows, то результат будет другой. Файл будет создаваться долго и реально займет место на
    WikipediaSparse filecomputer file stored with logically zero, physically unallocated holes
  • Python Заметки

    18 мая, 08:59изменён

    Мы рассмотрели два способа управления конеткстом переменных. Если вам показалось, что это выглядит излишне и можно было бы оставить один, то вам не показалось. Способ с threading.local придуман для разделения переменных между потоками. CоntextVar был добавлен как новый метод для асинхронного кода, но оказался настолько универсальным, что его можно использовать и с потоками. После появления ContextVar в PEP567 его рекомендовано использовать вместо threading.local. И даже был сделан бекпорт для версий ниже 3.7.1.Теперь, если совместить ContextVar и Proxy-класс из прошлого примера то получим такой класс↗️.Но у этого класса есть две проблемы:1️⃣ Нигде не вызывается reset для сброса переменной, что может приводить проблемам- утечка памяти - "грязный" конеткст при переиспользовании потоков - невозможность вернуться к дефолтуРешим это с помощью конектстного менеджера: @contextlib.cont
    Python Enhancement Proposals (PEPs)PEP 567 – Context Variables | peps.python.orgThis PEP proposes a new contextvars module and a set of new CPython C APIs to support context variables. This concept is similar to thread-local storage (TLS), but, unlike TLS, it also allows correctly keeping track of values per asynchronous task, e.g...
  • Python Заметки

    11 мая, 09:01изменён

    Теперь аналогичная история с тредами. Для тредов используется объект threading.local. Он позволяет создать локальный динамический атрибут (да, вот так костыльно) для треда.Вот базовый пример:import threading import time import random# глобальная переменная thread_data = threading.local()def execute(): # поулчаем локальное значение для текущего треда current_user_id = getattr(thread_data, "user_id", -1) print(f"Log {threading.current_thread().name}: {current_user_id}")def thread_task(user_id): # устанавливаем значение для текущего треда time.sleep(random.random())
    Gistthread-local-obj.ipynbGitHub Gist: instantly share code, notes, and snippets.
  • Python Заметки

    4 мая, 09:01

    В асинхронных приложениях есть один не всегда очевидный момент, который приводит к неявным багам - это общие глобальные объекты. Да, это в целом антипаттерн, но иногда такие объекты действительно нужны и вполне уместны. Например, когда вы завязаны на уже существующем коде и не можете его поменять, но переменную подставлять надо, при этом явно пробросить её не получится. Для этого используется ContexctVar. Случаи бывают разные но я приведу самый понятный пример - логирование. Допустим, мы не можем передать id юзера куда-то внутрь фреймворка, но можем использовать его в своем хендлере подставляя как переменную. В примере будет без хендлера но суть та же. import asyncio from contextvars import ContextVar import random# это переменная, которая будет разной для каждой корутины user_id_ctx = ContextVar("user_id", default=-1)async def handle_request(user_name, user_id): # устанавливаем
  • Python Заметки

    27 апр., 09:03

    Nuitka 4.0Библиотека для компиляции python-кода в исполняемые файлы получила мажорный апдейт.Ключевые изменения: - ускорение сборки бинарника в 15 раз - экспериментальная поддержка компилятора Zig - возможность выбранные функции оставлять как есть, в виде байт кода через декоратор @nuitka_ignore - бинарники работают до 30% быстрей (CPU-bound задачи) - теперь можно вместо отдельного скрипта сборки использовать pyproject.toml. Весь конфиг в одном файле! - улучшен контроль подключения DLL библиотек для Windows - улучшена совместимость с рядом популярных и не очень пакетамиИ в целом выбран путь на повышение производительности бинарной сборки.Полная информация ➡️ здесь.#libs
    Иллюстрация к посту канала Python ЗаметкиИллюстрация к посту канала Python Заметки
    1,0109211Открыть в Telegram
  • Python Заметки

    20 апр., 09:01

    Недавно делал быстрый прототип асинхронного приложения в котором требовалось вызывать много синхронного кода. Да, я знаю, что это не лучший дизайн, но нужно было быстрое решение на один процесс и без очередей. Поэтому я выполнял код в потоках. Выглядело это примерно так:from fastapi.concurrency import run_in_threadpoolasync def execute(data: DataRequest) -> DataResponse: try: result = await run_in_threadpool(sync_function, data) return DataResponse(data=result) except Exception as e: return DataResponse( error=str(e), success=False, )В общем работает нормально. Для всех вызовов под капотом используется общий тредпул, всё работает предсказуемо. Но потребовалось изменить количество запускаемых в пуле потоков (по умолчанию создается 40 воркеров). Так как дело происходит с FastAPI, делается это через lifespan используя настройки anyio:import anyio
    1,070531Открыть в Telegram
  • Python Заметки

    13 апр., 09:00изменён

    Стандартная библиотека asyncio это стандарт (начиная с Py3.4) для работы с асинхронным кодом. Но эта библиотека достаточно низкоуровневая, со своими проблемами, устаревшими подходами. Чтобы исправить это, были созданы разные обертки и альтернативы с реализацией популярных инструментов и паттернов асинхронного программирования. Это такие библиотеки как:- trio: улучшает корректность выполнения, не оставляя потерянных корутин при ошибках, то есть предлагает Structured Concurrency из коробки.- curio: упрощение синтаксиса и читаемости кода, больше похоже на работу с потоками.- anyio: универсальная обертка над asyncio или trio плюс множество вспомогательных инструментов.anyio используется в FastAPI как основная библиотека для работы с асинхронным кодом и вызовом синхронного кода из асинхронного.В общем, рекомендую почитать про возможности anyio, возможно вы более не будете
    1,020521Открыть в Telegram
  • Python Заметки

    1 апр., 09:03

    Сгеодня перестал работать Telegram в РФ. Жаль, что вы уже не прочитаете это сообщение. Но если вдруг прочитаете то знайте - канал переехал в MAX! Подписывайтесь чтобы быть на связи 😎
    1,140393111Открыть в Telegram
  • Python Заметки

    30 мар., 09:01

    Если запустить REPL с модулем asyncio, то вы входите в особый асинхронный REPL.user@host:~$ python -m asyncio asyncio REPL 3.12.7 ... Use "await" directly instead of "asyncio.run()". >>> import asyncio >>>В этом режиме - создаётся и настраивается event loop - уже импортирован asyncio - работает await на верхнем уровнеТо есть такая команда сработает без ошибок! await asyncio.sleep(3)Удобно для тестирования асинхронных функций без создания ивентлупов и остальной обвязки. Работает в: 3.8+#tricks #async
    1,3301421Открыть в Telegram
  • Python Заметки

    23 мар., 09:02изменён

    Мы используем Makefile думая, что нет альтернатив, что это стандарт и всё такое. Но make это не запускалка команд, а система сборки. Мы фактически используем его не по назначению. И на самом деле альтернатива есть! Некоторое время назад я открыл для себя прекрасный инструмент - just. Он решает все проблемы make.just - это не система сборки как make, это именно исполнитель команд! Больше никаких Phony Targets и табуляций, привет нормальный синтаксис и передача аргументов!!! 😎⭐️ Что умеет just:✅ Автодокументирование команд Не нужно делать отдельную команду с докой, просто добавь комментарий # команда сборки build: ...$ just --list Available recipes: build # команда сборкиКоманда с именем default запускается по умолчанию если не указано другое, так что я обычно делаю так:
    GitHubGitHub - casey/just:🤖 Just a command runner. Contribute to casey/just development by creating an account on GitHub.
  • Python Заметки

    21 мар., 09:04

    Все паблики облетела новость о покупке Astral. Мнения бытуют разные, так что мне сложно даже предполагать к чему это приведёт. Сегодня всё так быстро меняется и происходит то, во что раньше бы никто не поверил! Вобщем, будем надеятся.https://openai.com/index/openai-to-acquire-astral/#offtop
    OpenAIOpenAI to acquire AstralAccelerates Codex growth to power the next generation of Python developer tools
  • Python Заметки

    16 мар., 09:03

    Еще одно применение пайпов - в контексте с Enum. Но для этого нужен специальный Enum основанный на типе Flag. В связке с auto он генерирует битовые маски, которые впоследствии можно использовать с оператором |from enum import Flag, autoclass Perm(Flag): READ = auto() # 1 (0001) WRITE = auto() # 2 (0010) EXECUTE = auto() # 4 (0100) DELETE = auto() # 8 (1000)Теперь мы можем комбинировать их через пайп admin_perms = Perm.READ | Perm.WRITE | Perm.EXECUTE user_perms = Perm.READ | Perm.EXECUTE print(admin_perms) # <Perm.READ|WRITE|EXECUTE: 7>Можно делать проверки через in (возвращает bool) if Perm.READ in admin_perms: