TGViewer
Находки в опенсорсе Находки в опенсорсе @opensource_findings · 12.6K subscribers
Post #949 10.5K
PEP-827: Самое интересное, что случалось с типами в питоне!

Текст: https://peps.python.org/pep-0827/
Обсуждение: https://discuss.python.org/t/pep-827-type-manipulation/106353

Если вы когда-то писали на TypeScript (одобряем) или на каких-то других языках с продвинутой системой типов, вам всегда должно было быть больно от того, что происходит в Python.

Да, тут можно выразить некоторые простые вещи. Но, как например типизировать такой код?


@dataclass
class User:
username: str
age: int

def get_field(obj: Any, field_name: str) -> Any:
return getattr(obj, field_name)

user = User('example', 18)
username = get_field(user, 'username')
# ^ мы знаем, что тут `str`, но никак не можем такое выразить, кроме КУЧИ `@overload` для конкретного типа
# а для общего случая - вообще никак


Никак, обидно. Я даже 100 лет назад делал такую поделку: https://github.com/wemake-services/mypy-extras
Чтобы хоть как-то решать проблему выше.

Предложение

И вот Юрий Селиванов (автор asyncio и edge-db) предлагает добавить в питон специальные действия над типами.
Чтобы было как в TS, где есть условные и рекурсивные типы, готовые операторы как keyof и куча дополнительных типов в npm.

Вот что предлагают добавить:


<type> = ...
# Type booleans are all valid types too
| <type-bool>

# Conditional types
| <type> if <type-bool> else <type>

# Types with variadic arguments can have
# *[... for t in ...] arguments
| <ident>[<variadic-type-arg> +]

# Type member access
| <type>.<name>

| GenericCallable[<type>, lambda <args>: <type>]


А еще:
– Типовые операторы: IsAssignable, IsEquivalent, GetArg, FromUnion, тд
– Методы для интроспекции объектов в типах: Members, Attrs, GetMember, тд
– Создание типов внутри аннотаций: NewProtocol, NewTypedDict

Пример

Показать детали работы всего я, конечно, не смогу. Но смогу показать один пример из ПЕПа.
Понятная проблема: есть какая-то модель пользователя. При создании данной модели - мы указываем все поля, кроме primary_key. Но показывать мы будем наружу все поля, кроме password.

Сейчас мы делаем что-то типа


class UserBase(SQLModel):
name: str = Field(index=True)
age: int | None = Field(default=None, index=True)

class User(UserBase, table=True):
id: int | None = Field(default=None, primary_key=True)
password: str = Field(hidden=True)

class UserPublic(UserBase):
id: int

class UserCreate(UserBase):
password: str


Но, мы можем создавать такие модели при помощи типов.
Полный код: https://github.com/vercel/python-typemap/blob/main/tests/test_fastapilike_2.py


# Extract the default type from an Init field.
# If it is a Field, then we try pulling out the "default" field,
# otherwise we return the type itself.
type GetDefault[Init] = (
GetFieldItem[Init, Literal["default"]]
if typing.IsAssignable[Init, Field]
else Init
)

# Create takes everything but the primary key and preserves defaults
type Create[T] = typing.NewProtocol[
*[
typing.Member[
p.name,
p.type,
p.quals,
GetDefault[p.init],
]
for p in typing.Iter[typing.Attrs[T]]
if not typing.IsAssignable[
Literal[True],
GetFieldItem[p.init, Literal["primary_key"]],
]
]
]


Данная страшная конструкция будет спрятана внутри SQLModel, а мы будем писать просто:


UserCreate = Create[User]


А внутри уже:
– Полная типизация всех полей
– Новая корректная модель, которая всегда актуальна

Круто?
Мое мнение: в детали данного предложения я пока не вникал, но в целом - направление правильное.

Обсуждение: а что вы думаете про такое развитие типизации в питоне?

P.S. Из телеги и ютюба не перекатываемся. Рекламы на канале и так почти не было, для меня - мало что меняется.
Если вы хотите поддерживать мою работу в опенсорсе и контент без рекламы скам-курсов и вечных прогревов, то всегда можно закинуть на бусти: https://boosty.to/sobolevn

| Поддержать | YouTube | GitHub | Чат |
Python Enhancement Proposals (PEPs) PEP 827 – Type Manipulation | peps.python.org We propose adding powerful type-level introspection and construction facilities to Python’s type system. This design is inspired largely by TypeScript’s conditional and mapped types, but is adapted to the distinct semantics and constraints of Python’s t...
  • 🔥 102
  • 👍 31
  • 🤔 19
  • ❤ 14
  • 💩 13
  • 👎 10
  • 🤮 4
  • 🎉 2
  • 👌 1
More from @opensource_findings
  1. Sep 15, 2026PEPы в Python окончательно вышли из-под контроля Давайте посмотрим, что происходит с ПЕПам…
  2. Sep 10, 2026Большая бесплатная конференция в Нижнем Новгороде 17 октября Регистрация: https://itgorky.…
  3. Sep 1, 2026Post #985
  4. Aug 24, 2026JIT могут удалить из CPython! PEP-836: https://peps.python.org/pep-0836 JIT в CPython имее…
  5. Aug 18, 2026Как AWS у опенсорсера пакеты отжимал Нерегулярная рубрика "посмотрите, что творится!". Дан…
  6. Aug 14, 2026Какие уникальные фичи есть в django-modern-rest? Иногда, когда я добавляю какие-то фичи в…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →