Python Typing: Повышение читаемости кода

PythonBeginner
Практиковаться сейчас

Введение

В этом руководстве вы узнаете, как использовать модуль typing в Python для добавления подсказок типов к вашему коду. Подсказки типов помогают сделать ваш код более читаемым и поддерживаемым, явно указывая ожидаемые типы входных и выходных данных ваших функций.

Базовые типы

Подсказки типов - это функция, появившаяся в Python 3.5, а модуль typing был добавлен в Python 3.5.2 для обеспечения стандартного набора аннотаций типов. Импортируйте соответствующие типы из модуля typing, чтобы начать использовать подсказки типов.

from typing import List, Tuple, Dict

Подсказки типов для базовых типов просты. Просто используйте сам тип в качестве подсказки.

Откройте Python-интерпретатор, введя следующую команду в терминале.

python3
  1. Определите переменную типа int, присвойте ей значение и выведите ее.
age: int = 25
print(age) #Output: 25
  1. Определите переменную типа float, присвойте значение и выведите ее.
temperature: float = 98.6
print(temperature) ## Output: 98.6
  1. Определите переменную типа bool, присвойте ей значение и выведите ее.
is_raining: bool = True
print(is_raining) ## Output: True
  1. Определите переменную типа str, присвойте значение и выведите ее.
def greet(name: str) -> str:
    return f"Hello, {name}!"

print(greet("Alice")) ## Output: Hello, Alice!
  1. Определите функцию, которая принимает два аргумента типа 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.

  1. Определите переменную типа List[int], присвойте ей некоторые значения и выведите ее.
from typing import List
numbers: List[int] = [1, 2, 3, 4, 5]
print(numbers) ## Output: [1, 2, 3, 4, 5]
  1. Определите переменную типа 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}
  1. Определите переменную типа Tuple[str, int, float], присвойте ей некоторые значения и выведите ее.
from typing import Tuple
person: Tuple[str, int, float] = ("Alice", 25, 5.7)
print(person) ## Output: ('Alice', 25, 5.7)
  1. Определите функцию, которая принимает список целых чисел в качестве аргумента и возвращает результат в виде нового множества целых чисел.

Создайте проект под названием 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.

  1. Определите класс 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
  1. Определите класс 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.

  1. Определите функцию, которая принимает необязательный аргумент 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
  1. Определите класс 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 для добавления подсказок типов к вашему коду. Подсказки типов могут значительно повысить читаемость и поддерживаемость кода, делая его легче использовать при работе с большими кодовыми базами и сотрудничать с другими.