Я нашел новый годный фреимворк, называется он Starlite, и сейчас я вам расскажу, чем он мне понравился.
Starlite - это новый, гибкий асинхронный фреимворк для API, построенный на Pydantic и Starlette. Нет, это не очередной клон FastAPI, потому что у него совершенно другая философия.
По большей части фреимворк испытал влияние NestJS, например у него в основном используются классы-контроллеры, которые уже содержат в себе роуты для сущности и всякие компоненты.
Что ещё здесь есть?
- DI. Он очень прикольный, все зависимости описываются в контроллере.
- Мидлвари построены на мидлварях Starlette и это однозначно плюс.
- Guards, это такие вызываемые функции для работы с ролями, которые управляют доступами к ресурсам.
- Плагины! Например можно сделать кастомную валидацию или парсинг входящих данных.
- DTOFactory с ремаппингом, расширением и так далее. DTO это вообще полезный паттерн, для передачи данных между подсистемами, который исключает какую либо логику в инстансе класса кроме хранения данных и их де/сериализации.
- Классы для создания тестов из под коробки.
- Кеширование ответов с выбором бекенда (есть Redis, Memcached и Etcd).
- А ещё вебсокеты, OpenAPI и многое другое!
Фреимворк очень быстрый, активно развивается, контрибуторы помогают в проблемах с ним. Фреимворк так же задает базовую структуру проекта, (например только в контроллере у тебя должны быть вьюшки для сущности), а это позволяет не "наломать дров" при попытке придумать свою структуру.
В общем, выглядит круто. Буду продолжать наблюдать.
#библиотека
Starlite - это новый, гибкий асинхронный фреимворк для API, построенный на Pydantic и Starlette. Нет, это не очередной клон FastAPI, потому что у него совершенно другая философия.
По большей части фреимворк испытал влияние NestJS, например у него в основном используются классы-контроллеры, которые уже содержат в себе роуты для сущности и всякие компоненты.
Что ещё здесь есть?
- DI. Он очень прикольный, все зависимости описываются в контроллере.
- Мидлвари построены на мидлварях Starlette и это однозначно плюс.
- Guards, это такие вызываемые функции для работы с ролями, которые управляют доступами к ресурсам.
- Плагины! Например можно сделать кастомную валидацию или парсинг входящих данных.
- DTOFactory с ремаппингом, расширением и так далее. DTO это вообще полезный паттерн, для передачи данных между подсистемами, который исключает какую либо логику в инстансе класса кроме хранения данных и их де/сериализации.
- Классы для создания тестов из под коробки.
- Кеширование ответов с выбором бекенда (есть Redis, Memcached и Etcd).
- А ещё вебсокеты, OpenAPI и многое другое!
Фреимворк очень быстрый, активно развивается, контрибуторы помогают в проблемах с ним. Фреимворк так же задает базовую структуру проекта, (например только в контроллере у тебя должны быть вьюшки для сущности), а это позволяет не "наломать дров" при попытке придумать свою структуру.
В общем, выглядит круто. Буду продолжать наблюдать.
#библиотека
GitHub
GitHub - litestar-org/litestar: Production-ready, Light, Flexible and Extensible ASGI API framework | Effortlessly Build Performant…
Production-ready, Light, Flexible and Extensible ASGI API framework | Effortlessly Build Performant APIs - litestar-org/litestar
Кто-то решил сравнить скорость работы list() vs. [], и почему что-то из вышеперечисленного быстрее. Очень занятное исследование, там так же есть про наши любимые однострочники с "list comp", почитайте.
*тык*
#статья #хабр
*тык*
#статья #хабр
Хабр
Кто быстрее создаёт списки в Python, list() или []
В процессе написания очередной программы задумался над тем, какой способ создания списков в Python работает быстрее. Большинство моих знакомых используют квадратные скобки. А некоторые совсем забыли о...
Анонсирование программы вознаграждения для urllib3
Немного слоупочная новость (неделя прошла), но всё же - у меинтейнеров появилась острая нехватка времени для допиливания urllib3 v2.0, поэтому они очень срочно ищут контрибьюторов и готовы платить от 100$ (большинство за 300$) за решение проблем и внесение фич в библиотеку. Таким образом они пытаются подогреть интерес к проекту и наконец допилить новую версию. Все награды выплачиваются через OpenCollective.
К слову, в прошлый раз они уже попытались это сделать через Твиттер, всё прошло прошло довольно неплохо, теперь пытаются расширить масштаб.
А масштаб там неплохой - как минимум хотят завести OpenSSL 3.0.
Идея звучит очень здраво - есть возможность заработать денег за вклад в опенсурс. Если интересно и найдете в себе силы - обязательно участвуйте!
Ну а если вам не жалко - можете кинуть деньги в фонд, зная что они пойду на оплату времени разработчиков.
#новости
Немного слоупочная новость (неделя прошла), но всё же - у меинтейнеров появилась острая нехватка времени для допиливания urllib3 v2.0, поэтому они очень срочно ищут контрибьюторов и готовы платить от 100$ (большинство за 300$) за решение проблем и внесение фич в библиотеку. Таким образом они пытаются подогреть интерес к проекту и наконец допилить новую версию. Все награды выплачиваются через OpenCollective.
К слову, в прошлый раз они уже попытались это сделать через Твиттер, всё прошло прошло довольно неплохо, теперь пытаются расширить масштаб.
А масштаб там неплохой - как минимум хотят завести OpenSSL 3.0.
Идея звучит очень здраво - есть возможность заработать денег за вклад в опенсурс. Если интересно и найдете в себе силы - обязательно участвуйте!
Ну а если вам не жалко - можете кинуть деньги в фонд, зная что они пойду на оплату времени разработчиков.
#новости
dataset - взаимодействие с реляционными БД для ленивых людей
Управление данными в реляционных БД имеет множество преимуществ (например организация связей), но они довольно редко используются там, где нужно просто сохранить в БД данные, чтобы потом с ними как-то работать. Из-за этого частенько данные сохраняют в CSV или JSON, но с ними в перспективе сложнее работать - обновлять в них данные или использовать поиск.
Другая проблема - изменяемость схемы данных. Постоянно нужно писать миграции если она изменилась.
Решение этих проблем - небольшая библиотека dataset. Она представляет собой обертку над SQLAlchemy, которая обеспечивает абстракцию, которая позволяет работать с реляционной БД как с NoSQL (например как с MongoDB)!
Одна из самых крутых фич в dataset - это изменение схемы налету. Вы можете записать любые данные, и если какой-то колонки в базе нет - библиотека создаст её за вас.
Всё это дело прекрасно работает с SQLite, PostgreSQL и MySQL.
GitHub | Документация
#библиотека
Управление данными в реляционных БД имеет множество преимуществ (например организация связей), но они довольно редко используются там, где нужно просто сохранить в БД данные, чтобы потом с ними как-то работать. Из-за этого частенько данные сохраняют в CSV или JSON, но с ними в перспективе сложнее работать - обновлять в них данные или использовать поиск.
Другая проблема - изменяемость схемы данных. Постоянно нужно писать миграции если она изменилась.
Решение этих проблем - небольшая библиотека dataset. Она представляет собой обертку над SQLAlchemy, которая обеспечивает абстракцию, которая позволяет работать с реляционной БД как с NoSQL (например как с MongoDB)!
Одна из самых крутых фич в dataset - это изменение схемы налету. Вы можете записать любые данные, и если какой-то колонки в базе нет - библиотека создаст её за вас.
Всё это дело прекрасно работает с SQLite, PostgreSQL и MySQL.
GitHub | Документация
#библиотека
👏6❤3
Коробка с питоном
У меня тут небольшая хотелка возникла, я захотел исходя из описаний полей в Pydantic модели генерировать запрос на выборку с фильтрацией из БД. Оказывается, кто-то уже сделал похожее для Django. Выглядит неплохо, но всё же саму генерацию запроса я бы вынес…
Помните, я тут хотел сделать "классы-фильтры", из которых бы генерировался запрос в базу с фильтрацией? Я, конечно, сделал наколеночный вариант (который крутится в проде!) и пошел искать уже готовые библиотеки. И нашел sqlalchemy-filters.
Тут всё проще - фильтры описываются в словарях. Умеет в джоины, сортировку и пагинацию. Идеально подходит для всяких REST API, поэтому если вам нужно быстрое решение - можно не заниматься велосипедостроением и воспользоваться этой библиотекой.
#библиотека
Тут всё проще - фильтры описываются в словарях. Умеет в джоины, сортировку и пагинацию. Идеально подходит для всяких REST API, поэтому если вам нужно быстрое решение - можно не заниматься велосипедостроением и воспользоваться этой библиотекой.
#библиотека
GitHub
GitHub - juliotrigo/sqlalchemy-filters: Filter, sort and paginate SQLAlchemy query objects. Ideal for exposing these actions over…
Filter, sort and paginate SQLAlchemy query objects. Ideal for exposing these actions over a REST API. - juliotrigo/sqlalchemy-filters
👏6
Гуглил как мне в Pydantic изменять входящие данные (забыл что это можно делать через валидатор) и натолкнулся на Blue Book - персональную вики одного разработчика, который пишет о различных темах - активизме, здоровье и так далее. Сейчас это обзывают модным словом Digital garden.
Но так как у нас канал о Python, и мы будем говорить о нём, у него есть небольшой раздел связанный с Python, со сниппетами, обсуждением библиотек и концепций.
Очень рекомендую заглянуть!
#ссылочки
Но так как у нас канал о Python, и мы будем говорить о нём, у него есть небольшой раздел связанный с Python, со сниппетами, обсуждением библиотек и концепций.
Очень рекомендую заглянуть!
#ссылочки
lyz-code.github.io
Digital Garden - The Blue Book
My personal digital garden
👏2
Если вы любите делать игры на Godot или хотите начать их делать, при этом разбираться с GDScript вам лень - вы можете попробовать использовать godot-python. Godot - это прекраснейший движок, чтобы начать разрабатывать игры. Как по мне выглядит получше Unity, особенно для всяких небольших мобильных игр (особенно на фоне последних новостей).
Ребята пытаются добавить поддержку скриптинга на Python в Godot, и судя по тому как развивается проект - получается это у них довольно неплохо.
Из минусов я бы выделил: странный механизм экспорта проекта, вместе с игрой вы экспортите интерпретатор питона (хотя для кого-то это не минус), отсутствие pip из под коробки - его ставить нужно отдельно.
#библиотека #gamedev
Ребята пытаются добавить поддержку скриптинга на Python в Godot, и судя по тому как развивается проект - получается это у них довольно неплохо.
Из минусов я бы выделил: странный механизм экспорта проекта, вместе с игрой вы экспортите интерпретатор питона (хотя для кого-то это не минус), отсутствие pip из под коробки - его ставить нужно отдельно.
#библиотека #gamedev
GitHub
GitHub - touilleMan/godot-python: Python support for Godot 🐍🐍🐍
Python support for Godot 🐍🐍🐍. Contribute to touilleMan/godot-python development by creating an account on GitHub.
Тут сборки PyPy для Python 3.8 и 3.9 зарелизили под маковский M1 (а если быть точнее - macOS ARM64). Отличная новость для разработчиков которые пользуются новыми макбуками!
#новости
#новости
PyPy
M1 support for PyPy
The PyPy team is happy to announce that we can now target the macOS ARM64
platform. Much of the work was executed by Maciej Fijałkowski (fijal) and
funded via a generous contribution to our OpenCollec
platform. Much of the work was executed by Maciej Fijałkowski (fijal) and
funded via a generous contribution to our OpenCollec
❤2👏1
Django 4.1 вышел! Список изменений, из интересного:
1) Асинхронный интерфейс к ORM. Под капотом выполняет
2) В CBV можно делать асинхронные методы. Подробнее тут.
3) То, чего мне не хватало - ограничения
4) Добавили команду optimizemigration которая попытается оптимизировать миграции.
#новости #django
1) Асинхронный интерфейс к ORM. Под капотом выполняет
sync_to_async()
, про лимиты и подводные камни можно почитать тут. Сделали как и предполагал, чтобы сделать асинхронный get
нужно добавить букву a
в начало - aget
, afirst
и т.д.2) В CBV можно делать асинхронные методы. Подробнее тут.
3) То, чего мне не хватало - ограничения
Check
, unique
и exclusion
проверяются во время валидации модели.4) Добавили команду optimizemigration которая попытается оптимизировать миграции.
#новости #django
❤3
Давно как-то искал как можно поднять свой pypi сервер, в итоге остановился на комплексном решении от Sonatype Nexus. На testdriven.io вышла замечательная статья, как это сделать при помощи pypiserver. Всё разворачивается в нашем с вами любимом докере :)
Github сервера
#статья
Github сервера
#статья
❤1
Нашел свежий доклад со сравнением использования CTE и SFW в Django ORM и SQLAlchemy, спойлер: джанга в такие штуки не умеет, пишите raw sql.
Ещё внезапно для себя узнал насколько алхимия мощная в плане рефлексии и как с ней легко работать используя уже существующую базу.
#посмотреть #sqlalchemy #django
Ещё внезапно для себя узнал насколько алхимия мощная в плане рефлексии и как с ней легко работать используя уже существующую базу.
#посмотреть #sqlalchemy #django
YouTube
Как Django и Alchemy (не) справляются со сложным SQL
Михаил Попугин (S7, Python-разработчик) @ Moscow Python №77
"Иногда проект перерастает Django ORM, и в игру входит SQLAlchemy. Расскажу, как каждый из них справляется (или нет) с нашей сложной бизнес-логикой. Ещё немного о том, почему мы выбрали SQLAlchemy…
"Иногда проект перерастает Django ORM, и в игру входит SQLAlchemy. Расскажу, как каждый из них справляется (или нет) с нашей сложной бизнес-логикой. Ещё немного о том, почему мы выбрали SQLAlchemy…
Нашел прекрасную утилиту которая позволяет модернизировать питонячий код - refurb.
Есть у нас вот такой код:
#утилиты
Есть у нас вот такой код:
for filename in ["file1.txt", "file2.txt"]:Refurb подсветит моменты, где код можно улучшить. Например, использовать кортежи вместо листов или выбрать более удобный метод для какой либо операции.
with open(filename) as f:
contents = f.read()
lines = contents.splitlines()
for line in lines:
if not line or line.startswith("# ") or line.startswith("// "):
continue
for word in line.split():
print(f"[{word}]", end="")
print("")
$ refurb main.pyRefurb не является тайп- или стаилчекером. Его задача - делать код лучше и не более того.
main.py:3:17 [FURB109]: Use `in (x, y, z)` instead of `in [x, y, z]`
main.py:4:5 [FURB101]: Use `y = Path(x).read_text()` instead of `with open(x, ...) as f: y = f.read()`
main.py:10:40 [FURB102]: Replace `x.startswith(y) or x.startswith(z)` with `x.startswith((y, z))`
main.py:16:9 [FURB105]: Use `print() instead of `print("")`
#утилиты
GitHub
GitHub - dosisod/refurb: A tool for refurbishing and modernizing Python codebases
A tool for refurbishing and modernizing Python codebases - dosisod/refurb
👏7❤3
СТО из ДомКлик разобрал в своём докладе такую, казалось бы, банальную вещь как обработка ошибок. Доклад очень интересен структурно - в нём рассмотрены как и сами конструкции (ну а в друг кто забыл?), так и байткод создания исключений, рассмотрено их поведение на примере исходников интерпретатора.
А дальше - глубже! Автор так же затронул потоки, асинхронщину и неявные raise (например как с ZeroDivisionError).
#посмотреть #exceptions
А дальше - глубже! Автор так же затронул потоки, асинхронщину и неявные raise (например как с ZeroDivisionError).
#посмотреть #exceptions
YouTube
Алексей Кузьмин. Обработка ошибок в Python
Алексей Кузьмин, ДомКлик, Москва
Обработка ошибок в Python
В нашем IT-мире есть только один достоверный источник информации — исходный код. Документация может быть не актуальной, книжка может устареть, статья может осветить только один аспект. А исходный…
Обработка ошибок в Python
В нашем IT-мире есть только один достоверный источник информации — исходный код. Документация может быть не актуальной, книжка может устареть, статья может осветить только один аспект. А исходный…
🔥5👏2
Я заметил, что редко использую функции из
Сам модуль itertools это набор из эффективных и быстрых по памяти инструментов, возвращающие итераторы. Сами по себе итераторы можно комбинировать с такими функциями как
А сегодня мы начнем c самых простых - c бесконечных итераторов. Всего по документации их три:
Ниже я буду указывать аргументы по умолчанию и возможные передаваемые типы как тайп-хинты. Надеюсь ни у кого не возникнет проблем с пониманием.
#itertools #std
itertools
, в основном когда нужно произвести какие-то "красивые" шаманства. Теперь будем вспоминать саму библиотеку вместе, естественно с примерами :)Сам модуль itertools это набор из эффективных и быстрых по памяти инструментов, возвращающие итераторы. Сами по себе итераторы можно комбинировать с такими функциями как
map()
, list()
лямбдами или же использовать их с помощью цикла for. А сегодня мы начнем c самых простых - c бесконечных итераторов. Всего по документации их три:
count()
, cycle()
и repeat()
.Ниже я буду указывать аргументы по умолчанию и возможные передаваемые типы как тайп-хинты. Надеюсь ни у кого не возникнет проблем с пониманием.
#itertools #std
Коробка с питоном
Я заметил, что редко использую функции из itertools, в основном когда нужно произвести какие-то "красивые" шаманства. Теперь будем вспоминать саму библиотеку вместе, естественно с примерами :) Сам модуль itertools это набор из эффективных и быстрых по памяти…
count(start: int | float = 0, step: int | float = 1) -> Iterator[int | float]
Создает итератор, который возвращает равномерно распределенные значения, начиная с числа, указанного в аргументе start. Само значение-шаг указывается в переменной step:>>> first = count(10, 2)Небольшая загадка для вас - почему вместо 0.3 получили такое число? Пишите в комменты :)
>>> next(first)
10
>>> next(first)
12
>>> next(first)
14
>>> second = count(0.1, 0.1)
>>> next(second)
0.1
>>> next(second)
0.2
>>> next(second)
0.30000000000000004
>>> next(second)
0.4
#itertools #std
Коробка с питоном
Я заметил, что редко использую функции из itertools, в основном когда нужно произвести какие-то "красивые" шаманства. Теперь будем вспоминать саму библиотеку вместе, естественно с примерами :) Сам модуль itertools это набор из эффективных и быстрых по памяти…
cycle(p: Iterable) -> Iterator
Создает итератор, который возвращает элементы из переданного итератора поштучно и сохраняет их. После того как элементы закончились, он начинает возвращать сохранённые элементы и так до тех пор, пока мы сами не прервем его работу: >>> first = cycle([1, 2])Например, вот так при помощи функций islice и cycle мы можем сгенерировать список из 20 элементов из необходимой нам коллекции:
>>> next(first)
1
>>> next(first)
2
>>> next(first)
1
>>> next(first)
2
>>> list(islice(cycle([1, 2, 3, 4]), None, 20))
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
#itertools #std
❤1
Коробка с питоном
Я заметил, что редко использую функции из itertools, в основном когда нужно произвести какие-то "красивые" шаманства. Теперь будем вспоминать саму библиотеку вместе, естественно с примерами :) Сам модуль itertools это набор из эффективных и быстрых по памяти…
repeat(object: T, times: Optional[int] = None) -> Iterable[T]
Создает итератор который возвращает объект снова и снова. Можно указать параметр times, который вернет объект заданное количество раз и завершит работу итератора:>>> first = repeat("hehe", 3)Очень часто repeat используют чтобы по быстрому сгенерировать коллекцию из элементов:
>>> next(first)
'hehe'
>>> next(first)
'hehe'
>>> next(first)
'hehe'
>>> next(first)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> list(repeat(10, 10))#itertools #std
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
❤1
Там у Python 3.11 сегодня релиз, пройдемся по изменениям. Разделю пост на 2 части, сначала расскажу про всё остальное, а потом про typing, который снова прокачали.
1) Теперь Питон быстрее на 10-60% чем предыдущая версия. Почему такой разброс и где что ускорилось можно почитать здесь.
2) Exception Groups и *except. За это отвечает PEP 654, теперь есть возможность возбуждать и обрабатывать группы исключений. Судя по PEP сделано в основном для асинхронщины (
3) Для Exception появилась возможность добавлять примечания (notes). Теперь можно после обработки исключения добавить какую-то дополнительную информацию. Почитать подробно можно в PEP 678
4) Многие ждали и дождались - теперь в стандартной библиотеке есть tomllib, который позволяет работать с форматом TOML. Мотивация - его использует куча инструментов (black, mypy, pytest и т.д.), при чем каждый либо использует свою наколеночную реализацию, либо какую-то другую библиотеку. А тут решили стандартизировать, теперь это PEP 680.
5) Трейсбеки снова улучшили, теперь интерпретатор умеет показывать где именно находится ошибка, а не писать строку, где она произошла. Посмотреть на то как это выглядит можно в PEP 657.
6) Объявлены устаревшими следующие модули: aifc, audioop, cgi (за что?) и cgitb, chunk, crypt, imghdr (пользуйтесь PIL), mailcap, msilib, nis, nntplib, ossaudiodev, pipes (давно есть subprocess), sndhdr, spwd, sunau, telnetlib (вот этого я точно не могу понять), uu, xdrlib. Их удалят в 3.13.
А самому почитать об изменениях можно здесь.
1) Теперь Питон быстрее на 10-60% чем предыдущая версия. Почему такой разброс и где что ускорилось можно почитать здесь.
2) Exception Groups и *except. За это отвечает PEP 654, теперь есть возможность возбуждать и обрабатывать группы исключений. Судя по PEP сделано в основном для асинхронщины (
asyncio.gather
), колбеков и операций с несколькими попытками.3) Для Exception появилась возможность добавлять примечания (notes). Теперь можно после обработки исключения добавить какую-то дополнительную информацию. Почитать подробно можно в PEP 678
4) Многие ждали и дождались - теперь в стандартной библиотеке есть tomllib, который позволяет работать с форматом TOML. Мотивация - его использует куча инструментов (black, mypy, pytest и т.д.), при чем каждый либо использует свою наколеночную реализацию, либо какую-то другую библиотеку. А тут решили стандартизировать, теперь это PEP 680.
5) Трейсбеки снова улучшили, теперь интерпретатор умеет показывать где именно находится ошибка, а не писать строку, где она произошла. Посмотреть на то как это выглядит можно в PEP 657.
6) Объявлены устаревшими следующие модули: aifc, audioop, cgi (за что?) и cgitb, chunk, crypt, imghdr (пользуйтесь PIL), mailcap, msilib, nis, nntplib, ossaudiodev, pipes (давно есть subprocess), sndhdr, spwd, sunau, telnetlib (вот этого я точно не могу понять), uu, xdrlib. Их удалят в 3.13.
А самому почитать об изменениях можно здесь.
❤1
Коробка с питоном
Там у Python 3.11 сегодня релиз, пройдемся по изменениям. Разделю пост на 2 части, сначала расскажу про всё остальное, а потом про typing, который снова прокачали. 1) Теперь Питон быстрее на 10-60% чем предыдущая версия. Почему такой разброс и где что ускорилось…
Немного с запозданием, но поговорим про новые фичи в typing.
1)
Есть такой специальный класс как
Теперь для описания полей в нём добавили три вещи:
1.
2.
3. Аргумент
Почитать подробнее о нём можно вот тут
2) Self.
Ликуйте, господа, мы дождались! Больше никаких костылей с TypeVar!
Аннотация
3) LiteralString.
Относительно этого тайпхинта строки бывают двух типов - литеральные строки и произвольные строки. К литеральным строкам относятся константы, к произвольным - всё остальное. Данный тип указывает, что строка должна быть первого типа, на остальное оно будет ругаться. Вот пример:
4) Data class transforms
Декоратор который декорирует класс, метакласс или функцию которые являются декоратором. Получившийся декоратор умеет показывать тайпчекеру что декорируемый объект имеет фичи как у датакласса. Причина создания такой штуки проста - нет стандартного пути обозначения, что какой-то объект имеет свойства, присущие датаклассу. Привет Pydantic! PEP 681 читать здесь.
5) Вариативные дженерики.
Есть такая штука как
Зачем это нужно: мы все знаем, что всякие датасотонисты любят наш питон из-за обилия всяких инструментов по типу NumPy или Pandas. Вариативные дженерики позволяют параметризировать структуры, которые подобны массивам, что в свою очередь позволяет находить ошибки при операции с этими структурами тайпчекеру.
PEP 646 читать здесь.
#pep
1)
NotRequired
и Required поля в TypedDict
.Есть такой специальный класс как
TypedDict
- он позволяет добавить тайпхинты к словарю.Теперь для описания полей в нём добавили три вещи:
1.
NotRequired
- показывает, что данного поля может и не быть в словаре.2.
Required
- показывает, что данное поле обязательно должно быть в словаре3. Аргумент
total
- если его значение ложно, то все поля в этом классе будут отмечены как NotRequired
. По умолчанию оно истинно.Почитать подробнее о нём можно вот тут
2) Self.
Ликуйте, господа, мы дождались! Больше никаких костылей с TypeVar!
Аннотация
Self
показывает что мы хотим вернуть инстанс текущего класса. Выглядит это как-то так:class MyLock:Простенько и лаконично. Вот PEP 673.
def __enter__(self) -> Self:
self.lock()
return self
3) LiteralString.
Относительно этого тайпхинта строки бывают двух типов - литеральные строки и произвольные строки. К литеральным строкам относятся константы, к произвольным - всё остальное. Данный тип указывает, что строка должна быть первого типа, на остальное оно будет ругаться. Вот пример:
def run_query(sql: LiteralString) -> ...Исходя из примера видно, что использоваться это будет во всяких функциях, которые выполняют, например, SQL запросы или CLI-утилитах не давая на уровне тайпчекера засунуть в функцию очередной
...
def caller(
arbitrary_string: str,
query_string: LiteralString,
table_name: LiteralString,
) -> None:
run_query("SELECT * FROM students") # ok
run_query(query_string) # ok
run_query("SELECT * FROM " + table_name) # ok
run_query(arbitrary_string) # type checker error
run_query( # type checker error
f"SELECT * FROM students WHERE name = {arbitrary_string}"
)
rm -rf
. А PEP 675 можно почитать здесь.4) Data class transforms
Декоратор который декорирует класс, метакласс или функцию которые являются декоратором. Получившийся декоратор умеет показывать тайпчекеру что декорируемый объект имеет фичи как у датакласса. Причина создания такой штуки проста - нет стандартного пути обозначения, что какой-то объект имеет свойства, присущие датаклассу. Привет Pydantic! PEP 681 читать здесь.
5) Вариативные дженерики.
Есть такая штука как
TypeVar
- она позволяет создавать дженерик параметризированный одним типом. А если нам нужно параметризировать произвольное количество типов? Теперь появился TypeVarTuple
, который решает эту проблему.Зачем это нужно: мы все знаем, что всякие датасотонисты любят наш питон из-за обилия всяких инструментов по типу NumPy или Pandas. Вариативные дженерики позволяют параметризировать структуры, которые подобны массивам, что в свою очередь позволяет находить ошибки при операции с этими структурами тайпчекеру.
PEP 646 читать здесь.
#pep
❤4