Python: Аннотации типов
В Python в функцию можно передать любые значения. Иногда это усложняет понимание кода: не всегда ясно, что именно ожидает функция и что она возвращает.
Чтобы сделать код понятнее, в Python есть аннотации типов. С их помощью можно явно указать, какие значения принимает функция и какой результат она возвращает. Эти подсказки полезны в редакторах кода: они показывают ожидаемые типы аргументов и помогают быстрее разобраться, как пользоваться функцией.
Как указывать типы параметров
Аннотация функции описывает два элемента:
- Типы параметров — указываются прямо в определении функции после имени каждого параметра через двоеточие.
- Тип возвращаемого результата — указывается после списка параметров с помощью стрелки ``>`.
Разберем на примере функции, которая вычисляет сумму двух переданных значений:
def add(a: int, b: int) -> int:
return a + b
print(add(2, 3)) # => 5
Теперь редактор кода будет подсказывать, что функция add
принимает два числа и возвращает число. Если попытаться передать строку, редактор подсветит это как проблему и предупредит.
Какие типы используются в аннотациях
На этом этапе достаточно знать аннотации для простых, примитивных типов данных:
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
Пример с параметрами по умолчанию
Аннотации работают одинаково как для обязательных параметров, так и для тех, у которых есть значение по умолчанию. Сначала указывается тип, потом через =
— стандартное значение.
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(text, n)
. Она должна принимать два параметра:
- Строку
- Число, которое обозначает, сколько раз нужно повторить строку
И возвращает строку, которая повторяется n-раз. Если передается ноль, то возвращается пустая строка.
text = 'python'
print(word_multiply(text, 2)) # => pythonpython
print(word_multiply(text, 0)) # =>
Укажите аннотации типов при объявлении функции.
Подсказка
- Не забудьте, что аннотацию типов также нужно указать и у возвращаемого значения
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
import index
def test():
expected = [str, int, str]
annotations = index.word_multiply.__annotations__
print(annotations)
assert list(annotations.values()) == expected, "You should use type annotations!" # noqa: E501
assert index.word_multiply("python", 1) == "python"
assert index.word_multiply("python", 3) == "pythonpythonpython"
assert index.word_multiply("java", 0) == ""
Решение учителя откроется через:
20:00
