Если запустить REPL с модулем asyncio, то вы входите в особый асинхронный REPL.user@host:~$ python -m asyncioasyncio 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
Python Заметки
@pythonotes
Интересные заметки и обучающие материалы по PythonКонтакт: @paulwinex⚠️ Рекламу на канале не делаю!⚠️Хештеги для поиска:#tricks#libs#pep#basic#regex#qt#django#2to3#source#offtop
Похожие каналы
Все →Последние посты
Мы используем Makefile думая, что нет альтернатив, что это стандарт и всё такое.Но make это не запускалка команд, а система сборки. Мы фактически используем его не по назначению.И на самом деле альтернатива есть! Некоторое время назад я открыл для себя прекрасный инструмент - just. Он решает все проблемы make.just - это не система сборки как make, это именно исполнитель команд!Больше никаких Phony Targets и табуляций, привет нормальный синтаксис и передача аргументов!!! 😎⭐️ Что умеет just:✅ Автодокументирование командНе нужно делать отдельную команду с докой, просто добавь комментарий# команда сборкиbuild: ...$ just --listAvailable recipes: build # команда сборкиКоманда с именем default запускается по умолчанию если не указано другое, так что я обычно делаю так:default: just --listТеперь просто выполняем just и получаем доку из текущего файла.✅ Удобная работа с переменными окружения# загрузить из .envset dotenv-load# глобальная переменнаяexport PYTHONPATH := "./src"# переменная для командыtest $TESTUNG="true": pytest✅ Передача аргументовbuild target: @echo 'Build {{target}}...'команда запуска$ just build dev# Build dev...✅ Выбор интерпретатора прямо в командеПример с инлайн-скриптом на python:system: #!/usr/bin/env python3 import platform print(platform.system())Эта же функция позволит выполнить скрипт как одну команду вместо перезапуска шела для каждой строкиfoo: #!/usr/bin/env sh for file in ls .; do echo $file done✅ Выполнение команды в определенной директории. Можно указать как релятивный путь так и абсолютный[working-directory: 'backend']build: docker compose buildТакже можно задать рабочую директорию глобальноТам еще много интересного:- поддержка функций- автокомплиты и интеграции- экспрешены- алиасы команд- группировка команд- альтернативы команды под разные ОС- импорт других just-файлов- цветной вывод- ... и другие штуковины!Так что вперёд - ➡️ читать доку! Репозиторий: ➡️ https://github.com/casey/justСтатья: ➡️ https://www.
Все паблики облетела новость о покупке Astral. Мнения бытуют разные, так что мне сложно даже предполагать к чему это приведёт. Сегодня всё так быстро меняется и происходит то, во что раньше бы никто не поверил! Вобщем, будем надеятся.https://openai.com/index/openai-to-acquire-astral/#offtop
Еще одно применение пайпов - в контексте с 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.EXECUTEuser_perms = Perm.READ | Perm.EXECUTEprint(admin_perms)# <Perm.READ|WRITE|EXECUTE: 7>Можно делать проверки через in (возвращает bool)if Perm.READ in admin_perms: print("Success!")Либо через & (возвращает совпадение либо 0)print(Perm.READ & admin_perms)# <Perm.READ: 1>print(Perm.WRITE & user_perms)# <Perm: 0>Оператор ~ инвертирует все флагиprint(~admin_perms)#<Perm.DELETE: 8>Можно заранее создать комбинацию.class Perm(Flag): READ = auto() # 1 (0001) WRITE = auto() # 2 (0010) EXECUTE = auto() # 4 (0100) DELETE = auto() # 8 (1000) RW = READ | WRITEmode = Perm.READprint(mode & Perm.RW)# <Perm.READ: 1> (True)print(mode & Perm.EXECUTE)# <Perm: 0> (False)Flag более изолирован. Он не равен числу напрямую, что защищает от случайных ошибок в логике.#tricks
Оператор pipe позволяет писать более компактный код, реализуя логику объединения данных (Union). Важно помнить, что его поведение зависит от контекста. Побитовые операции (логическое OR)result = 5 | 3# 5 (0101) | 3 (0011) = 7 (0111)Самое главное - не путать с оператором or, это другое!Объединение множествset_a = {1, 2, 3}set_b = {3, 4, 5}set_c = set_a | set_b # {1, 2, 3, 4, 5}set_c |= {5, 6}# {1, 2, 3, 4, 5, 6}Слияние словарейdict_1 = {"a": 1, "b": 2}dict_2 = {"b": 3, "c": 4}merged = dict_1 | dict_2 # {'a': 1, 'b': 3, 'c': 4}merged |= {"d": 5}# {'a': 1, 'b': 3, 'c': 4, 'd': 5}Аннотации типов, заменяет Uniondef process_data(value: int | str) -> None: print(value)Допустимо использовать в isinstance или issubclassisinstance(3, int | float)# TrueПаттерн-матчингstatus_code = 404match status_code: case 200 | 201 | 204: print("OK") case 400 | 404 | 500: print("ERROR")Для использования в своих классах требуется переопределить метод __or__Так же нашел библиотеку pipe которая добавляет еще много возможностей. Рекомендую ознакомиться ;)#basic

💐❤️✨🌼⭐️
Почему в прошлом посте я использовал StrEnum а не Enum?Всё просто, дефолтный Enum не поддерживает нативное сравнение с нужным нам типом.from enum import Enumclass DefaultEnum(Enum): KEY = "value""value" == DefaultEnum.KEY # False"value" == DefaultEnum.KEY.value # TrueКак видите, приходится вызывать .value, что неудобно в некоторых случаях и более многословно. StrEnum это исправляет:from enum import StrEnumclass StringEnum(StrEnum): KEY = "value""value" == StringEnum.KEY # True Для примера из прошлого поста это выглядело бы так:if task.status == TaskStatus.PENDING: ...Точно так же работает и IntEnum.StrEnum появился в версии 3.11, для более ранних использовали комбинацию MyEnum(str, Enum), что не тоже самое.StrEnum правильно создает значения с функцией auto(). Сочетание str+Enum создает числа, но в виде строк. Приходится явно писать строки. Сделал пару примеров для сравнения↗️Когда не стоит использовать StrEnum:- когда нужно явное отличие значений энума от строки- когда в проекте уже используется обычный Enum#tricks
Вы до сих пор используете в проекте "магические" строки?😖@dataclassclass Task: status: str ...def create_pending_task(data: dict) -> Task: task = Task(**data) task.status = "pending" # < магическая строка return taskГде тут проблема?🔸 Если "pending" изменится на "wait", вам придется искать это слово по всему проекту🔸 Напишете panding вместо pending и баг вылезет только в рантайме в непредсказуемом месте🔸 Вам очень повезет, если в проекте нет такой же строки но с другим смысломКак делать правильно?Используем модуль enumfrom enum import StrEnumclass TaskStatus(StrEnum): PENDING = "pending" RUNNING = "running" COMPLETED = "completed"@dataclassclass Task: status: TaskStatus ...def create_pending_task(data: dict) -> Task: task = Task(**data) task.status = TaskStatus.PENDING return taskПочему это лучше:▫️Теперь это не строка а объект▫️ IDE сможет подсказать какие статусы существуют, вам не нужно лезть в документацию или базу▫️ Единый источник истины. Изменяем в одном месте вместо поиска на всему проекту▫️ Типизация - наше всё, mypy умеет с этим работать▫️ Читаемость кода повышается. Ведь читаем мы его чаще чем пишем▫️ Автоматическая валидация допустимых значений в моделях Pydantic#tricks
А что происходит на противоположном фронте?Вы, вероятно, слышали, что 2026 год называют годом Linux на десктопе (в каких-то узких кругах - годом гейминга на Linux). Всё потому, что экосистема Linux постепенно становится более дружелюбной для обычных десктоп-юзеров (в том числе привыкших к Windows), и не только!▫️ всё чаще появляются Linux дистрибутивы визуально похожие на Windows (или даже лучше), и множество видео с советами какой дистрибутив попробовать новичкам. ▫️ обновления ядра и любых пакетов в экосистеме Linux всегда привносят оптимизацию и удобство и поддержку свежего железа (привет винде с её обратной тенденцией). Например грядущая версия 7.0, опять с множеством приятных мелочей.▫️ после 10 лет с последего релиза версии 5 окружение KDE Plasma получила мажорный апдейт версии 6 и активно развивается (уже доросла до 6.5). GNOME тоже не спит и готовит версию 50.▫️ в Wine добавили патч позволяющий устанавливать продукты Adobe на Linux. Для кого-то это был последний рубеж?😏▫️ Proton активно развивается, да так, что через эту прослойку игры работают даже быстрей чем нативно на винде. ▫️ с каждым релизом Wine и Proton поддерживается всё больше игр, что можно отслеживать на ProtonDB, и даже случаются бусты производительности.▫️ Я сам на днях на виндобук поставил ChacyOS после чего игры, которые тянули гдето в 5-10 FPS, стали играбельными! Подтверждено личным опытом! Кстати, есть несколько дистрибутивов заточенные именно под игры.▫️ Valve выпускают новую пачку железок которые (предположительно) порвут рынок гейминга (как и в прошлый раз) и (определнно точно) работают на Linux. Именно Valve вливает ресурсы в Linux в целом и в Proton в частности.▫️ Госсектор разных стран давно уже мигрирует на opensource, так как нет доверия системе которая может одномоментно неконтролируемо массово рухнуть или быть удаленно заблокированной (в том числе по политическим причинам).И ниже небольшой опрос - какая у вас операционка основная?Ни к чему не призываю, ничего не советую! Прост
Windows 11 становится всё менее дружелюбна к юзерам а порой и вовсе не юзабельной:▫️ постоянные ломающие апдейты которые не дают загрузить систему, откатить ломающие апдейты, и давно уже удаляют файлы пользователей без спроса. Тенденция в целом уже достаточно давно, включая глобальные сбои и другие неприятности.▫️ навязчивое продвижение AI шпионов агентов повсюду в системе которых никто не просил.▫️ всё больше ресурсов ВАШЕГО компа работают не для вас, а в угоду Microsoft. Мелкомягкие официально предлагают купить железо помощней (чтобы они и дальше могли половину мощности использовать по своему усмотрению) а оно что-то не покупается. Рядовой юзер не понимает зачем менять комп который и так норм работает. А глядя на текущие цены на память наступает ощущение что с этим миром что-то не так.▫️ люди булшитят винду и активно продвигают переход на Linux порой называя винду кучей слопа или даже вирусом, похищающим файлы с целью выкупа (они реально после аплоада и удаления с локала отключают доступ к файлам и требуют купить подписку). А сам Microsoft переименован в Microslop. Появляются даже тулзы для очистки системы от этого слопа.▫️ Microsoft уже не скрывает, что ваши данные уже не ваши, даже зашифрованные, ибо ваши пароли давно уже хранятся где надо и доступны кому надо.▫️ При всех этих факапах они закрыли поддержку Windows 10 не давая возможности откатиться на что-то более стабильное.То есть сами Microsoft стали катализатором поиска альтернатив.Сам я уже на Linux уже более 7 лет как на основной системе, дома винда есть только в виртуалке для тестов клиентского софта. Расскажите, как у вас обстоят дела на винде? Вы пользуетесь системой или боретесь с ней?#offtop