Введение
В этом руководстве вы узнаете, как использовать модуль typing в Python для добавления подсказок типов к вашему коду. Подсказки типов помогают сделать ваш код более читаемым и поддерживаемым, явно указывая ожидаемые типы входных и выходных данных ваших функций.
Базовые типы
Подсказки типов - это функция, появившаяся в Python 3.5, а модуль typing был добавлен в Python 3.5.2 для обеспечения стандартного набора аннотаций типов. Импортируйте соответствующие типы из модуля typing, чтобы начать использовать подсказки типов.
from typing import List, Tuple, Dict
Подсказки типов для базовых типов просты. Просто используйте сам тип в качестве подсказки.
Откройте Python-интерпретатор, введя следующую команду в терминале.
python3
- Определите переменную типа
int, присвойте ей значение и выведите ее.
age: int = 25
print(age) #Output: 25
- Определите переменную типа
float, присвойте значение и выведите ее.
temperature: float = 98.6
print(temperature) ## Output: 98.6
- Определите переменную типа
bool, присвойте ей значение и выведите ее.
is_raining: bool = True
print(is_raining) ## Output: True
- Определите переменную типа
str, присвойте значение и выведите ее.
def greet(name: str) -> str:
return f"Hello, {name}!"
print(greet("Alice")) ## Output: Hello, Alice!
- Определите функцию, которая принимает два аргумента типа
int, умножает их и возвращает результат в видеint.
def multiply(x: int, y: int) -> int:
return x * y
result = multiply(5, 10)
print(result) ## Output: 50
Контейнеры и обобщения
Подсказки типов для типов контейнеров (например, списков, словарей и множеств) могут быть более конкретными с использованием обобщений.
Совет: Эксперименты с порядковыми номерами 1-3 можно реализовать в Python-интерпретаторе, а эксперименты с порядковым номером 4 - в WebIDE.
- Определите переменную типа
List[int], присвойте ей некоторые значения и выведите ее.
from typing import List
numbers: List[int] = [1, 2, 3, 4, 5]
print(numbers) ## Output: [1, 2, 3, 4, 5]
- Определите переменную типа
Dict[str, int], присвойте ей несколько пар ключ-значение и выведите ее.
from typing import Dict
ages: Dict[str, int] = {"Alice": 25, "Bob": 30, "Charlie": 35}
print(ages) ## Output: {'Alice': 25, 'Bob': 30, 'Charlie': 35}
- Определите переменную типа
Tuple[str, int, float], присвойте ей некоторые значения и выведите ее.
from typing import Tuple
person: Tuple[str, int, float] = ("Alice", 25, 5.7)
print(person) ## Output: ('Alice', 25, 5.7)
- Определите функцию, которая принимает список целых чисел в качестве аргумента и возвращает результат в виде нового множества целых чисел.
Создайте проект под названием list_to_set.py в WebIDE и введите следующее содержимое.
from typing import List, Set
def get_unique_elements(elements: List[int]) -> Set[int]:
return set(elements)
numbers = [1, 2, 2, 3, 4, 4, 4, 5]
unique_numbers = get_unique_elements(numbers)
print(unique_numbers) ## Output: {1, 2, 3, 4, 5}
Используйте следующую команду для запуска скрипта.
python list_to_set.py
Пользовательские типы
Вы также можете использовать пользовательские типы и классы в качестве подсказок типов.
Совет: Этот эксперимент реализуется в WebIDE.
- Определите класс Person с типизированными атрибутами
name (str)иage (int)и методом get_summary, который возвращает строку, которая представляет имя и возраст человека.
Создайте проект под названием str_and_int_to_str.py в WebIDE и введите следующее содержимое.
class Person:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def get_summary(self) -> str:
return f"{self.name} is {self.age} years old."
person1 = Person("Alice", 25)
print(person1.get_summary()) ## Output: Alice is 25 years old.
Используйте следующую команду для запуска скрипта.
python str_and_int_to_str.py
- Определите класс Point с типизированными атрибутами
xиy, оба типаfloat, и методомdistance, который принимает другую точку в качестве аргумента и возвращает расстояние между двумя точками.
Создайте проект под названием other_to_float.py в WebIDE и введите следующее содержимое.
import math
class Point:
def __init__(self, x: float, y: float):
self.x = x
self.y = y
def distance(self, other: "Point") -> float:
return math.sqrt((self.x - other.x)**2 + (self.y - other.y)**2)
point1 = Point(0, 0)
point2 = Point(3, 4)
print(point1.distance(point2)) ## Output: 5.0
Используйте следующую команду для запуска скрипта.
python other_to_float.py
Псевдонимы типов
Алиасы типов могут создавать более читаемые подсказки типов, особенно для сложных типов.
Создайте проект под названием type_aliases.py в WebIDE и введите следующее содержимое.
from typing import List, Tuple
Coordinate = Tuple[float, float]
Path = List[Coordinate]
def get_distance(coord1: Coordinate, coord2: Coordinate) -> float:
return ((coord1[0] - coord2[0])**2 + (coord1[1] - coord2[1])**2)**0.5
start = (0, 0)
end = (3, 4)
print(get_distance(start, end)) ## Output: 5.0
Используйте следующую команду для запуска скрипта.
python type_aliases.py
Optional и None
Тип Optional можно использовать, когда значение может быть либо определенного типа, либо None.
- Определите функцию, которая принимает необязательный аргумент
int, умножает его на2, если он не равенNone, и возвращает результат в видеint, илиNone, если входной аргумент былNone.
Создайте проект под названием option_and_none_1.py в WebIDE и введите следующее содержимое.
from typing import Optional
def double_or_none(number: Optional[int]) -> Optional[int]:
if number is not None:
return number * 2
else:
return None
result1 = double_or_none(5)
result2 = double_or_none(None)
print(result1, result2) ## Output: 10 None
Используйте следующую команду для запуска скрипта.
python option_and_none_1.py
- Определите класс Person с типизированным атрибутом address, который может быть либо действительной строкой адреса, либо
None.
Создайте проект под названием option_and_none_2.py в WebIDE и введите следующее содержимое.
from typing import Optional
class Person:
def __init__(self, name: str, age: int, address: Optional[str]):
self.name = name
self.age = age
self.address = address
person1 = Person("Alice", 25, "123 Main St")
person2 = Person("Bob", 30, None)
print(person1.name, person1.age, person1.address) ## Output: Alice 25 123 Main St
print(person2.name, person2.age, person2.address) ## Output: Bob 30 None
Используйте следующую команду для запуска скрипта.
python option_and_none_2.py
Callable
Тип Callable используется для указания типа функции или метода.
Создайте проект под названием callable.py в WebIDE и введите следующее содержимое.
from typing import Callable
def apply_function(value: int, func: Callable[[int], int]) -> int:
return func(value)
def double(x: int) -> int:
return x * 2
print(apply_function(5, double)) ## Output: 10
Используйте следующую команду для запуска скрипта.
python callable.py
Типизированный словарь (Typeddict)
TypedDict позволяет создавать пользовательские словари с определенными ключами и типами значений.
Совет: TypedDict был введен в Python 3.8, поэтому вам нужно использовать Python 3.8 или более позднюю версию, чтобы его использовать.
Вот пример:
Создайте проект под названием typeddict.py в WebIDE и введите следующее содержимое.
from typing import TypedDict
class PersonInfo(TypedDict):
name: str
age: int
def greet(person: PersonInfo) -> str:
return f"Hello, {person['name']}! You are {person['age']} years old."
alice_info: PersonInfo = {"name": "Alice", "age": 30}
print(greet(alice_info)) ## Output: Hello, Alice! You are 30 years old.
Используйте следующую команду для запуска скрипта.
python typeddict.py
Newtype
NewType - это подсказка типа из модуля typing в Python, которая позволяет создать новый тип, который является просто оберткой вокруг существующего типа. Это может быть полезно для добавления более семантического смысла к переменным и аргументам функций.
Вот пример:
Создайте проект под названием newtype.py в WebIDE и введите следующее содержимое.
Затем выполните следующий скрипт на python.
from typing import NewType
UserId = NewType("UserId", int)
OrderId = NewType("OrderId", int)
def get_order(order_id: OrderId) -> str:
return f"Order with ID: {order_id}"
order_id = OrderId(123)
user_id = UserId(123)
print(get_order(order_id)) ## Output: Order with ID: 123
Используйте следующую команду для запуска скрипта.
python newtype.py
Статическая проверка типов
В Python статическую проверку типов можно выполнять с использованием подсказок типов и статического проверщика типов, такого как mypy. Подсказки типов указывают ожидаемые типы переменных, аргументов функций и возвращаемых значений. Вот пример:
Во - первых, установите mypy.
pip install mypy
Вот пример:
Создайте проект под названием mypy.py в WebIDE и введите следующее содержимое.
def add_numbers(x: int, y: int) -> int:
return x + y
result = add_numbers(2, 3)
print(result)
Затем запустите mypy на вашем скрипте.
mypy mypy.py
Это даст вам обратную связь о любых несоответствиях типов, обнаруженных в вашем коде.
Резюме
Вот и все! Теперь вы знаете, как использовать модуль typing в Python для добавления подсказок типов к вашему коду. Подсказки типов могут значительно повысить читаемость и поддерживаемость кода, делая его легче использовать при работе с большими кодовыми базами и сотрудничать с другими.



