Правила типизации Python рассыпаны по десяткам PEP и страницам документации, а два разных проверяющих на одном коде дают разные ответы. Андрей Наку и Дорел Лукану попробовали собрать это в одну модель.
Отправная точка: каждый тип в Python представлен классом, класс задаёт абстрактный тип данных, а такой тип описывается в терминах экзистенциальных типов. Дальше авторы разводят три отношения, которые в разговорах обычно смешивают: быть подклассом, быть экземпляром объекта и быть экземпляром типа.
По дороге разбираются вещи, полезные и без формализма:
🔘 почему объединение типов и классов в Python 2.2 и переход к порядку разрешения методов C3 в 2.3 определили нынешнее поведение множественного наследования;
🔘 чем
🔘 как устроен слой метаклассов, где класс одновременно и шаблон для экземпляров, и обычное значение;
🔘 чем расходятся
Авторы честно ограничивают область: формализм описывает программы, где типы не меняются на ходу, а подтипизация и динамика оставлены на будущее.
@zen_of_python
Отправная точка: каждый тип в Python представлен классом, класс задаёт абстрактный тип данных, а такой тип описывается в терминах экзистенциальных типов. Дальше авторы разводят три отношения, которые в разговорах обычно смешивают: быть подклассом, быть экземпляром объекта и быть экземпляром типа.
По дороге разбираются вещи, полезные и без формализма:
Protocol отличается от абстрактного базового класса и где проходит граница между проверкой во время выполнения и статической;mypy и Pyright: первый сильнее опирается на аннотации и знание стандартной библиотеки, второй заточен под быстрый статический анализ.Авторы честно ограничивают область: формализм описывает программы, где типы не меняются на ходу, а подтипизация и динамика оставлены на будущее.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
В асинхронных генераторах появится
Сейчас делегировать другому асинхронному генератору можно только циклом
🔘
🔘
🔘 компилятор перестаёт выдавать
PEP 525 в 2016 году отказался от этого из-за сложности реализации; автор нового PEP Питер Бирма считает, что нынешний код CPython это позволяет, и приложил рабочую реализацию. Вариант
@zen_of_python
yield from. PEP 828 принят 3 августа, целевая версия — Python 3.16.Сейчас делегировать другому асинхронному генератору можно только циклом
async for с ручным yield. Это прячет намерение, ломает связь asend(), athrow() и aclose() с вызывающей стороной и не даёт вернуть значение: приходится бросать исключение.result = yield from agenerator() делегирует aiter(), anext(), asend(), athrow() и aclose();return 3 внутри асинхронного генератора становится законным, значение приезжает через новый атрибут StopAsyncIteration.value, по аналогии со StopIteration.value;SyntaxError на return с значением и yield from в async def с yield.PEP 525 в 2016 году отказался от этого из-за сложности реализации; автор нового PEP Питер Бирма считает, что нынешний код CPython это позволяет, и приложил рабочую реализацию. Вариант
async yield from отвергли ради симметрии с обычными генераторами, и в тексте прямо сказано, что переключение контекста без явного await — спорное место.@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Уже завтра вечером в 19:00 по МСК приходите на открытое онлайн-собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходите в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
Starlette научился сжимать большие ответы вне event loop. В релизах с 1.4.0 по 1.6.0, вышедших 5 и 8 августа, переделан
🔘 тела от 128 КиБ сжимаются в рабочем потоке, а не в цикле событий; вместо
🔘 потоковые ответы получают flush на каждом чанке, частичные ответы (206) больше не сжимаются;
🔘
🔘 в 1.6.0 появился
Starlette лежит под FastAPI, так что изменение задевает и его. Полный список правок по версиям в release notes.
@zen_of_python
GZipMiddleware и подтянута защита FileResponse.GzipFile используется zlib.compressobj, и компрессор создаётся лениво;FileResponse отклоняет перевёрнутый однобайтовый Range и ограничивает число диапазонов сотней;max_body_size и поддержка расширения http.response.debug.Starlette лежит под FastAPI, так что изменение задевает и его. Полный список правок по версиям в release notes.
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM