|
1 | | -**Аннотации типов** — это возможность указать типы параметров и возвращаемое значение у функции в Python. Это не является обязательным требованием языка, но может помочь программистам в дальнейшей разработке, улучшить читаемость кода и повысить его надежность. |
| 1 | +В Python в функцию можно передать любые значения. Иногда это усложняет понимание кода: не всегда ясно, что именно ожидает функция и что она возвращает. |
2 | 2 |
|
3 | | -Давайте рассмотрим простой пример функции без аннотаций типов: |
| 3 | +Чтобы сделать код понятнее, в Python есть **аннотации типов**. С их помощью можно явно указать, какие значения принимает функция и какой результат она возвращает. Эти подсказки полезны в редакторах кода: они показывают ожидаемые типы аргументов и помогают быстрее разобраться, как пользоваться функцией. |
| 4 | + |
| 5 | +## Как указывать типы параметров |
| 6 | + |
| 7 | +Аннотация функции описывает два элемента: |
| 8 | + |
| 9 | +1. **Типы параметров** — указываются прямо в определении функции после имени каждого параметра через двоеточие. |
| 10 | +2. **Тип возвращаемого результата** — указывается после списка параметров с помощью стрелки ``>`. |
| 11 | + |
| 12 | +Разберем на примере функции, которая вычисляет сумму двух переданных значений: |
4 | 13 |
|
5 | 14 | ```python |
6 | | -def concat(first, second): |
7 | | - return first + second |
| 15 | +def add(a: int, b: int) -> int: |
| 16 | + return a + b |
| 17 | + |
| 18 | +print(add(2, 3)) # => 5 |
8 | 19 | ``` |
9 | 20 |
|
10 | | -Эта функция конкатенирует две строки в одну. При этом с первого взгляда на код сложно понять, что происходит в нем: какие типы у аргументов, почему функция работает со строками, а не складывает, например, два числа. |
| 21 | +Теперь редактор кода будет подсказывать, что функция `add` принимает два числа и возвращает число. Если попытаться передать строку, редактор подсветит это как проблему и предупредит. |
| 22 | + |
| 23 | +## Какие типы используются в аннотациях |
11 | 24 |
|
12 | | -Если в дальнейшем использовать эту функцию в коде, то может возникнуть необходимость проверять типы аргументов перед передачей их в функцию, что увеличивает объем кода и затрудняет его понимание. |
| 25 | +На этом этапе достаточно знать аннотации для простых, примитивных типов данных: |
13 | 26 |
|
14 | | -Теперь давайте добавим аннотации типов к функции: |
| 27 | +* `int` — целые числа |
| 28 | +* `float` — числа с плавающей точкой |
| 29 | +* `str` — строки |
| 30 | +* `bool` — логические значения (True или False) |
15 | 31 |
|
16 | 32 | ```python |
17 | | -def concat(first: str, second: str) -> str: |
18 | | - return first + second |
| 33 | +def describe(name: str, age: int, height: float) -> str: |
| 34 | + return f"{name}, {age} лет, рост {height}" |
| 35 | + |
| 36 | +print(describe("Anna", 25, 1.70)) |
| 37 | +# => Anna, 25 лет, рост 1.7 |
19 | 38 | ``` |
20 | 39 |
|
21 | | -Здесь мы указали, что аргументы `first` и `second` должны быть строкового типа (`str`). Возвращаемое значение тоже будет строковым. Когда мы будем использовать эту функцию в коде, нам будет проще понять, какие типы аргументов можно передавать и какой тип возвращаемого значения ожидается. |
| 40 | +## Пример с параметрами по умолчанию |
22 | 41 |
|
23 | | -Аннотации типов также могут быть использованы для определения типов переменных внутри функции. Например: |
| 42 | +Аннотации работают одинаково как для обязательных параметров, так и для тех, у которых есть значение по умолчанию. Сначала указывается тип, потом через `=` — стандартное значение. |
24 | 43 |
|
25 | 44 | ```python |
26 | | -def double(n: int) -> int: |
27 | | - result: int = n * 2 |
28 | | - return result |
| 45 | +def greet(name: str, greeting: str = "Hello") -> str: |
| 46 | + return f"{greeting}, {name}" |
| 47 | + |
| 48 | +print(greet("Anna")) # => Hello, Anna |
| 49 | +print(greet("Kirill", "Hi")) # => Hi, Kirill |
29 | 50 | ``` |
30 | 51 |
|
31 | | -В этом примере мы определили тип переменной `result` как `int`, используя аннотацию типа. |
| 52 | +В этом примере `name` — обязательный параметр, а `greeting` имеет значение по умолчанию. Аннотации показывают типы обоих параметров и возвращаемого результата. |
| 53 | + |
| 54 | +## Аннотации и проверка кода |
| 55 | + |
| 56 | +Хотя сам Python не проверяет аннотации во время выполнения программы, есть отдельные инструменты, которые умеют это делать. Такой подход называют **статической проверкой кода**. |
| 57 | + |
| 58 | +"Статическая" значит, что проверка происходит ещё до запуска программы. Инструмент читает исходный код и сверяет, соответствуют ли переданные значения указанным типам. |
| 59 | + |
| 60 | +Например, если функция принимает строку, а вы передадите число, то при статической проверке это будет показано как ошибка. |
| 61 | + |
| 62 | +Особенно удобно, когда такие ошибки подсвечивает редактор прямо во время написания кода. Это позволяет сразу увидеть проблему и исправить её, не дожидаясь запуска программы. Благодаря этому в работающем коде становится меньше неожиданных ошибок — многие из них отлавливаются заранее. |
32 | 63 |
|
33 | | -Аннотации типов — это не строгая проверка типов в Python. Их использование не гарантирует, что функция будет вызвана с аргументами и возвращаемым значением указанных типов. Все таки Python остается динамически типизированным языком. В нем аннотации типов не влияют на возможность передачи аргументов различных типов или возвращения значений других типов. Тем не менее их использование упрощает чтение и понимание кода и помогает отслеживать ошибки. |
| 64 | +Аннотации типов не являются обязательными. Функции можно писать и без них — Python всё равно будет работать. Но когда аннотации есть, код становится понятнее для людей и удобнее для редакторов. Нужно ли аннотировать функции в своем коде? Да, это считается хорошей практикой. |
0 commit comments