TGViewer
Zen of Python Zen of Python @zen_of_python · 18.8K subscribers
Post #4218 2.93K
В чем сила аннотаций типов

Type Hints — годный инструмент, ибо помогают находить ошибки типов ещё до запуска кода, но настоящая их сила в другом. С ними вы думаете о структуре данных, делая код менее ломким. Появились в Python 3.5 в 2015 году и прижились так хорошо. что даже IDE напоминают вам о них ворнингами.

Взгляните на функцию, что вычисляет скидку для списка товаров:


def calculate_discount(items, discount):
return [item * (1 - discount) for item in items]


Всё работает, но не совсем понятно:

— Что именно items? Список? Кортеж? Генератор?
— Какой тип у discount?
— Что возвращает функция?

Код «самопроясняется», если добавить typing.List:


from typing import List

def calculate_discount(items: List[float], discount: float) -> List[float]:
return [item * (1 - discount) for item in items]


Мы можем пойти дальше. Зачем ограничивать функцию только List[float], если она также могла бы принять кортеж, множество или генератор?


from collections.abc import Iterable

def calculate_discount(items: Iterable[float], discount: float) -> List[float]:
return [item * (1 - discount) for item in items]


Теперь items — любая итерируемая структура: список, кортеж, генератор. Такой подход делает функцию более универсальной.

Это и есть главное преимущество Type Hints: они заставляют задуматься — а не слишком ли жёсткие ограничения я накладываю на входные данные? А не стоит ли сделать интерфейс функции более абстрактным?

Допустим, вы проектируете класс заказа. Если сначала использовали List для хранения товаров, то подумав о типах, вы можете заменить это на Set, чтобы избежать повторений. Или вместо хранения всех элементов в памяти начать использовать генератор для ленивой загрузки данных из базы.

Аннотации типов подталкивают вас к обобщённому проектированию, где функции и классы не зависят от конкретных реализаций.

Входы — как можно шире, выходы — как можно конкретнее.


#основы
@zen_of_python
  • 👍 1
More from @zen_of_python
  1. Sep 28, 2026partial или lambda: как специализировать колбэк без сюрпризов functools.partial заранее св…
  2. Sep 28, 2026Как коллизии превращают построение set в Python в квадратичную задачу Привычное O(1) для s…
  3. Sep 28, 2026Как проверять инварианты Python-кода с Hypothesis Обычный тест фиксирует конкретный ввод и…
  4. Sep 27, 2026Как запускать собственный SQL через миграции Django У models.Index нашлось необычное приме…
  5. Sep 27, 2026Как разделить синхронный и асинхронный Python-клиенты При переписывании akismet автор отка…
  6. Sep 27, 2026Как заменить цепочку isinstance на singledispatch Когда обработка типов разрастается, цепо…
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 →