Модуль typing у Python - це модуль, який дозволяє вказувати типи даних для змінних, аргументів функцій та значень, що повертаються. Він призначений для підтримки статичної типізації та покращення читабельності коду.
Ось деякі типи, методи та класи, які надає модуль typing, та приклади їх використання:
Any: цей тип вказує, що значення може бути будь-якого типу. Він корисний, коли ви не знаєте точного типу даних або хочете дозволити декілька типів. Приклад використання:
from typing import Any
def process_data(data: Any) -> None:
print(data)
process_data(42)
process_data("Hello, world!")
Union: цей тип дозволяє вказати, що значення може бути одним з декількох типів. Наприклад:
Union[int, float]
означає, що значення може бути або цілим числом, або дійсним числом. Приклад використання:
from typing import Union
def add_numbers(a: Union[int, float], b: Union[int, float]) -> Union[int, float]:
return a + b
result = add_numbers(1, 2.5)
print(result)
Optional: цей тип використовується для вказівки на те, що значення може бути None, крім вказаного типу. Наприклад:
Optional[int]
означає, що значення може бути або цілим числом, або None. Приклад використання:
from typing import Optional
def find_index(numbers: List[int], target: int) -> Optional[int]:
if target in numbers:
return numbers.index(target)
return None
index = find_index([1, 2, 3], 2)
print(index)
List, Tuple, Set, Dict: ці типи дозволяють вказувати типи елементів колекцій. Наприклад:
List[int]
означає список цілих чисел, а
Dict[str, int]
означає словник, де ключі - рядки, а значення - цілі числа. Приклад використання:
from typing import List, Tuple, Set, Dict
def process_collections(numbers: List[int], coordinates: Tuple[float, float], names: Set[str], ages: Dict[str, int]) -> None:
print(numbers)
print(coordinates)
print(names)
print(ages)
process_collections([1, 2, 3], (1.0, 2.0), {"Alice", "Bob"}, {"Alice": 30, "Bob": 25})
Callable: цей тип використовується для вказівки на функції або методи. Він приймає два аргументи: список типів аргументів функції та тип значення, що повертається. Наприклад:
Callable[[int, int], int]
означає функцію, яка приймає два цілих числа та повертає ціле число. Приклад використання:
from typing import Callable
def apply_function(func: Callable[[int, int], int], a: int, b: int) -> int:
return func(a, b)
def add(a: int, b: int) -> int:
return a + b
result = apply_function(add, 1, 2)
print(result)
TypeVar: цей тип дозволяє визначати власні типи змінних, які можуть бути використані для створення універсальних функцій або класів. Приклад використання:
from typing import TypeVar, List
T = TypeVar("T")
def reverse_list(items: List[T]) -> List[T]:
return items[::-1]
reversed_integers = reverse_list([1, 2, 3])
reversed_strings = reverse_list(["a", "b", "c"])
print(reversed_integers)
print(reversed_strings)
NewType: цей тип дозволяє створювати нові типи даних на основі існуючих типів, але з різною семантикою. Наприклад, ви можете створити новий тип UserId на основі int, але з різною семантикою. Приклад використання:
from typing import NewType
UserId = NewType("UserId", int)
def get_user_name(user_id: UserId) -> str:
return f"User {user_id}"
user_id = UserId(42)
print(get_user_name(user_id))
TypedDict: цей тип дозволяє вказувати типи значень для ключів словника. Наприклад:
TypedDict("Person", {"name": str, "age": int})
означає словник з ключами "name" та "age", де значення "name" - рядок, а значення "age" - ціле число. Приклад використання:
from typing import TypedDict
class Person(TypedDict):
name: str
age: int
def print_person(person: Person) -> None:
print(f"{person['name']} is {person['age']} years old")
person: Person = {"name": "Alice", "age": 30}
print_person(person)
Protocol: цей тип дозволяє визначати протоколи, які можуть бути реалізовані класами. Протоколи визначають набір методів, які повинні бути реалізовані класом, що реалізує протокол. Приклад використання:
from typing import Protocol
class Drawable(Protocol):
def draw(self) -> None:
...
class Circle:
def draw(self) -> None:
print("Drawing a circle")
def draw_shape(shape: Drawable) -> None:
shape.draw()
circle = Circle()
draw_shape(circle)
Literal: цей тип дозволяє вказувати конкретні значення, які можуть бути прийняті або повернуті функцією. Наприклад:
Literal["red", "green", "blue"]
означає, що значення може бути одним з рядків "red", "green" або "blue". Приклад використання:
from typing import Literal
def print_color(color: Literal["red", "green", "blue"]) -> None:
print(f"The color is {color}")
print_color("red")
Висновок
Модуль typing у Python дозволяє вказувати типи даних для змінних, аргументів функцій та значень, що повертаються, що полегшує розуміння коду та підтримку статичної типізації.