TG Telegram Group & Channel
Питонические атаки | United States America (US)
Create: Update:

В Python 3.12 приняли PEP 695 – Type Parameter Syntax, который добавляет новый синтаксис для дженерик классов, функций и алиасов для типов. Это вот то, где используется typing.TypeVar (спойлер: больше нет). Да, это снова про тайп хинты. Похоже, это самая активно развивающаяся область языка за последние 10 лет.

Давайте посмотрим на изменение на примере функции с переменными типа (смотри скриншот 1). Если что, это нужно для того, чтобы связать типы нескольких параметров и возвращаемых значений функции. Вот функция принимает на вход значение (любого типа), а на выходе она отдаст значение такого же типа. Часто используемый сценарий, как мне кажется. Такое стало писать намного приятнее. Не нужно отдельно писать это явное, некрасивое определение typing.TypeVar, где ты дважды пишешь одно и то же имя переменной и засоряешь странными однобуквенными именами глобальную область видимости. В 3.12 можно будет просто прям при определении функции задекларировать своё намерение: "я буду тут использовать переменную типа T", и аннотируешь ей все связанные аргументы и возвращаемые значения. Офигенно? О да.

Кроме того, тайп-алиасы с переменными типов тоже стало писать намного легче (смотри скриншот 2). Тоже отпала необходимость явно определять TypeVar. Но теперь в языке появляется новое "мягкое" ключевое слово type, которое ведёт себя по-разному в зависимости от контекста (как async). Забавно, что это нововведение фактически депрекейтит PEP 613 про тайп алиасы, который появился в 3.10. Я даже толком не успел начать им пользоваться. Всё так быстро меняется.

Про классы-дженерики писать не буду, но если вы такое практикуете, то сходите почитайте док. Там интересно.

Отдельно прикольно, что больше не надо думать о ковариантности, контравариантности и инвариантности переменных типов. Эти концепции никуда не уходят, но теперь тайп-чекер будет сам понимать, с чем он работает, без необходимости явного указания. Это вот та штука, из-за которой приходится аргументы функций аннотировать как Sequence[Parent] вместо list[Parent] и которую я долго не мог осознать. Кстати, недавно смотрел хороший видос про эти концепции. Разобрался, вроде. Блин, не может ли недостаток понятных материалов на эту тему быть связан с тем, что эти слова так сложно писать и произносить? Я минуту набирал и перечитывал эти три слова в начале абзаца, да и то наверняка ошибся.

Если не думать о том, что это изменение создаёт новую область видимости для имён (scope) с довольно странной механикой работы, добавляет новое мягкое ключевое слово, добавляет новый сорт TypeVar (теперь у нас есть "традиционные" и новые, и их нельзя смешивать между собой) и в целом делает язык синтаксически сложнее (давайте писать квадратные скобки вообще везде), то это абсолютно точно движение в правильную сторону, шаг навстречу программисту. Бойлерплейта станет меньше, импортов из typing меньше, сложных концепций меньше, пространства для ошибки тоже. Да и выглядит относительно предыдущего варианта намного приятнее. Мне нравится.

В Python 3.12 приняли PEP 695 – Type Parameter Syntax, который добавляет новый синтаксис для дженерик классов, функций и алиасов для типов. Это вот то, где используется typing.TypeVar (спойлер: больше нет). Да, это снова про тайп хинты. Похоже, это самая активно развивающаяся область языка за последние 10 лет.

Давайте посмотрим на изменение на примере функции с переменными типа (смотри скриншот 1). Если что, это нужно для того, чтобы связать типы нескольких параметров и возвращаемых значений функции. Вот функция принимает на вход значение (любого типа), а на выходе она отдаст значение такого же типа. Часто используемый сценарий, как мне кажется. Такое стало писать намного приятнее. Не нужно отдельно писать это явное, некрасивое определение typing.TypeVar, где ты дважды пишешь одно и то же имя переменной и засоряешь странными однобуквенными именами глобальную область видимости. В 3.12 можно будет просто прям при определении функции задекларировать своё намерение: "я буду тут использовать переменную типа T", и аннотируешь ей все связанные аргументы и возвращаемые значения. Офигенно? О да.

Кроме того, тайп-алиасы с переменными типов тоже стало писать намного легче (смотри скриншот 2). Тоже отпала необходимость явно определять TypeVar. Но теперь в языке появляется новое "мягкое" ключевое слово type, которое ведёт себя по-разному в зависимости от контекста (как async). Забавно, что это нововведение фактически депрекейтит PEP 613 про тайп алиасы, который появился в 3.10. Я даже толком не успел начать им пользоваться. Всё так быстро меняется.

Про классы-дженерики писать не буду, но если вы такое практикуете, то сходите почитайте док. Там интересно.

Отдельно прикольно, что больше не надо думать о ковариантности, контравариантности и инвариантности переменных типов. Эти концепции никуда не уходят, но теперь тайп-чекер будет сам понимать, с чем он работает, без необходимости явного указания. Это вот та штука, из-за которой приходится аргументы функций аннотировать как Sequence[Parent] вместо list[Parent] и которую я долго не мог осознать. Кстати, недавно смотрел хороший видос про эти концепции. Разобрался, вроде. Блин, не может ли недостаток понятных материалов на эту тему быть связан с тем, что эти слова так сложно писать и произносить? Я минуту набирал и перечитывал эти три слова в начале абзаца, да и то наверняка ошибся.

Если не думать о том, что это изменение создаёт новую область видимости для имён (scope) с довольно странной механикой работы, добавляет новое мягкое ключевое слово, добавляет новый сорт TypeVar (теперь у нас есть "традиционные" и новые, и их нельзя смешивать между собой) и в целом делает язык синтаксически сложнее (давайте писать квадратные скобки вообще везде), то это абсолютно точно движение в правильную сторону, шаг навстречу программисту. Бойлерплейта станет меньше, импортов из typing меньше, сложных концепций меньше, пространства для ошибки тоже. Да и выглядит относительно предыдущего варианта намного приятнее. Мне нравится.
👍205🎉2🤮2


>>Click here to continue<<

Питонические атаки






Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)