Python: Аннотации типов
В Python в функцию можно передать любые значения. Иногда это усложняет понимание кода: не всегда ясно, что именно ожидает функция и что она возвращает. Чтобы сделать код понятнее, в Python есть аннотации типов. С их помощью можно явно указать, какие значения принимает функция и какой результат она возвращает. Таким образом мы решаем сразу несколько задач:
- Улучшаем работу редактора кода, получаем подсказки, лучше автодополнение и тому подобное.
- Помогаем ИИ агентам быстрее видеть структуру и принимать более правильные решения минимизируя случайные ошибки.
- Появляется возможность проверять корректность программы без ее запуска, за счет статической проверки. Такая проверка не гарантирует, что логика программы написана правильно, но, по крайней мере, в ней не будет ошибок типов.

Как указывать типы параметров
Аннотация функции описывает два элемента. Типы параметров указываются прямо в определении функции после имени каждого параметра через двоеточие. Тип возвращаемого результата указывается после списка параметров с помощью стрелки ->.
Разберем на примере функции, которая вычисляет сумму двух переданных значений:
def add(a: int, b: int) -> int:
return a + b
print(add(2, 3)) # => 5def concat(a: str, b: str) -> str:
│ │ │
│ │ └── тип возвращаемого значения
│ └── тип параметра b
└── тип параметра aТеперь редактор кода будет подсказывать, что функция add принимает два числа и возвращает число. Если попытаться передать строку, редактор подсветит это как проблему и предупредит.
add("2", 3) # Argument of type "str" is not assignable to parameter of type "int"Какие типы используются в аннотациях
На этом этапе достаточно знать аннотации для простых, примитивных типов данных:
intдля целых чисел,floatдля чисел с плавающей точкойstrдля строкboolдля логических значений (True или False)
def describe(name: str, age: int, height: float) -> str:
return f"{name}, {age} лет, рост {height}"
print(describe("Anna", 25, 1.70))
# => Anna, 25 лет, рост 1.7Если функция ничего не возвращает, то в качестве возвращаемого типа указывается None. Например, функция может только печатать текст на экран:
def print_greeting(name: str) -> None:
print(f"Hello, {name}!")
print_greeting("Anna")
# => Hello, Anna!Пример с параметрами по умолчанию
Аннотации работают одинаково как для обязательных параметров, так и для тех, у которых есть значение по умолчанию. Сначала указывается тип, потом через = указывается стандартное значение.
def greet(name: str, greeting: str = "Hello") -> str:
return f"{greeting}, {name}"
print(greet("Anna")) # => Hello, Anna
print(greet("Kirill", "Hi")) # => Hi, KirillВ этом примере name является обязательным параметром, а greeting имеет значение по умолчанию. Аннотации показывают типы обоих параметров и возвращаемого результата.
Аннотации и проверка кода
Хотя сам Python не проверяет аннотации во время выполнения программы, есть отдельные инструменты, которые умеют это делать и, обычно, они встроены прямо в редактор. Такой подход называют статической проверкой кода, то есть проверкой выполняемой без запуска кода.
"Статическая" значит, что проверка происходит еще до запуска программы. Инструмент читает исходный код и сверяет, соответствуют ли переданные значения указанным типам. Например, если функция принимает строку, а вы передадите число, то при статической проверке это будет показано как ошибка.

Особенно удобно, когда такие ошибки подсвечивает редактор прямо во время написания кода. Это позволяет сразу увидеть проблему и исправить ее, не дожидаясь запуска программы. Благодаря этому многие неожиданные ошибки отлавливаются заранее и в работающем коде их становится меньше.
Аннотации типов не являются обязательными. Функции можно писать и без них, Python все равно будет работать. Но когда аннотации есть, код становится понятнее для людей и удобнее для редакторов. Аннотирование функций в своем коде считается хорошей практикой.
Задание
Приложение создаёт текстовые разделители из повторяющихся символов — например, ------- или =====. Реализуйте функцию word_multiply(). Она должна принимать два параметра:
- Строку
- Число, которое обозначает, сколько раз нужно повторить строку
И возвращает строку, которая повторяется n-раз. Если передается ноль, то возвращается пустая строка.
text = 'python'
print(word_multiply(text, 2)) # => pythonpython
print(word_multiply(text, 0)) # =>Укажите аннотации типов при объявлении функции.
Подсказка
- Не забудьте, что аннотацию типов также нужно указать и у возвращаемого значения
Python: Аннотации типов
В Python в функцию можно передать любые значения. Иногда это усложняет понимание кода: не всегда ясно, что именно ожидает функция и что она возвращает. Чтобы сделать код понятнее, в Python есть аннотации типов. С их помощью можно явно указать, какие значения принимает функция и какой результат она возвращает. Таким образом мы решаем сразу несколько задач:
- Улучшаем работу редактора кода, получаем подсказки, лучше автодополнение и тому подобное.
- Помогаем ИИ агентам быстрее видеть структуру и принимать более правильные решения минимизируя случайные ошибки.
- Появляется возможность проверять корректность программы без ее запуска, за счет статической проверки. Такая проверка не гарантирует, что логика программы написана правильно, но, по крайней мере, в ней не будет ошибок типов.

Как указывать типы параметров
Аннотация функции описывает два элемента. Типы параметров указываются прямо в определении функции после имени каждого параметра через двоеточие. Тип возвращаемого результата указывается после списка параметров с помощью стрелки ->.
Разберем на примере функции, которая вычисляет сумму двух переданных значений:
def add(a: int, b: int) -> int:
return a + b
print(add(2, 3)) # => 5def concat(a: str, b: str) -> str:
│ │ │
│ │ └── тип возвращаемого значения
│ └── тип параметра b
└── тип параметра aТеперь редактор кода будет подсказывать, что функция add принимает два числа и возвращает число. Если попытаться передать строку, редактор подсветит это как проблему и предупредит.
add("2", 3) # Argument of type "str" is not assignable to parameter of type "int"Какие типы используются в аннотациях
На этом этапе достаточно знать аннотации для простых, примитивных типов данных:
intдля целых чисел,floatдля чисел с плавающей точкойstrдля строкboolдля логических значений (True или False)
def describe(name: str, age: int, height: float) -> str:
return f"{name}, {age} лет, рост {height}"
print(describe("Anna", 25, 1.70))
# => Anna, 25 лет, рост 1.7Если функция ничего не возвращает, то в качестве возвращаемого типа указывается None. Например, функция может только печатать текст на экран:
def print_greeting(name: str) -> None:
print(f"Hello, {name}!")
print_greeting("Anna")
# => Hello, Anna!Пример с параметрами по умолчанию
Аннотации работают одинаково как для обязательных параметров, так и для тех, у которых есть значение по умолчанию. Сначала указывается тип, потом через = указывается стандартное значение.
def greet(name: str, greeting: str = "Hello") -> str:
return f"{greeting}, {name}"
print(greet("Anna")) # => Hello, Anna
print(greet("Kirill", "Hi")) # => Hi, KirillВ этом примере name является обязательным параметром, а greeting имеет значение по умолчанию. Аннотации показывают типы обоих параметров и возвращаемого результата.
Аннотации и проверка кода
Хотя сам Python не проверяет аннотации во время выполнения программы, есть отдельные инструменты, которые умеют это делать и, обычно, они встроены прямо в редактор. Такой подход называют статической проверкой кода, то есть проверкой выполняемой без запуска кода.
"Статическая" значит, что проверка происходит еще до запуска программы. Инструмент читает исходный код и сверяет, соответствуют ли переданные значения указанным типам. Например, если функция принимает строку, а вы передадите число, то при статической проверке это будет показано как ошибка.

Особенно удобно, когда такие ошибки подсвечивает редактор прямо во время написания кода. Это позволяет сразу увидеть проблему и исправить ее, не дожидаясь запуска программы. Благодаря этому многие неожиданные ошибки отлавливаются заранее и в работающем коде их становится меньше.
Аннотации типов не являются обязательными. Функции можно писать и без них, Python все равно будет работать. Но когда аннотации есть, код становится понятнее для людей и удобнее для редакторов. Аннотирование функций в своем коде считается хорошей практикой.
Задание
Приложение создаёт текстовые разделители из повторяющихся символов — например, ------- или =====. Реализуйте функцию word_multiply(). Она должна принимать два параметра:
- Строку
- Число, которое обозначает, сколько раз нужно повторить строку
И возвращает строку, которая повторяется n-раз. Если передается ноль, то возвращается пустая строка.
text = 'python'
print(word_multiply(text, 2)) # => pythonpython
print(word_multiply(text, 0)) # =>Укажите аннотации типов при объявлении функции.
Подсказка
- Не забудьте, что аннотацию типов также нужно указать и у возвращаемого значения
Ваше упражнение проверяется по этим тестам
import solution
def test():
expected = [str, int, str]
annotations = solution.word_multiply.__annotations__
print(annotations)
assert list(annotations.values()) == expected, "You should use type annotations!" # noqa: E501
assert solution.word_multiply("python", 1) == "python"
assert solution.word_multiply("python", 3) == "pythonpythonpython"
assert solution.word_multiply("java", 0) == ""Решение учителя откроется через:
20:00
