В Python, когда мы работаем с более сложными типами данных, такими как словари, списки или кортежи, нам может понадобиться создавать собственные имена для этих типов, чтобы сделать наш код более читаемым и удобным в работе.
Для этого мы можем использовать функцию TypeAlias
из модуля typing
. Она позволяет нам создавать псевдонимы для существующих типов данных.
Например, представим, что мы часто работаем с данными, представленными в виде словаря, где ключи - строки, а значения - целые числа:
from typing import TypeAlias
# Создаем псевдоним для типа словаря
NumberDict: TypeAlias = dict[str, int]
def process_numbers(data: NumberDict) -> None:
for key, value in data.items():
print(f"Key: {key}, Value: {value}")
example_data: NumberDict = {
"apple": 5,
"banana": 3,
"cherry": 10
}
process_numbers(example_data)
В этом примере мы создаем псевдоним NumberDict для типа dict[str, int]
. Это делает наш код более читаемым и понятным, так как мы явно указываем, что ожидаем словарь, где ключи - строки, а значения - целые числа.
[!info] Использование типов псевдонимов помогает сделать ваш код более выразительным и понятным для других разработчиков, которые будут работать с вашим проектом.
Представим ситуацию, когда у нас присутствует объект с множеством вложенностей, которые нам нужно типизировать
from typing import TypeAlias
Products: TypeAlias = dict[str, dict[str, list[str]]]
def set_shop_products(data: Products) -> None:
...
# Пример структуры онлайн магазина
# {
# категория: {
# продукты: [ключи/аккануты]
# },
# }
example_data: Products = {
"Игры": {
"Don't Starve Together": [
"key1",
"key2",
"key3"
],
"Forza Horizon 5": [
"key1",
"key2",
"key3"
]
},
"Кино": {
"Кинопоиск": [
"account1",
"account2",
"account3"
],
"Иви": [
"account1",
"account2",
"account3"
]
}
}
process_person(example_data)
Здесь мы реализовали огромный объект, имеющий несколько вложенностей. Нам нужно его типизировать. Представляете, что-бы было, если бы нам пришлось аннотировать несколько функций которые принимали и возвращали объект такого типа. Было бы что-то на подобии такого:
def process_shop_data(data: dict[str, dict[str, list[str]]]) -> dict[str, dict[str, list[str]]]:
...
example_data: dict[str, dict[str, list[str]]] = ...
processed_shop_data: dict[str, dict[str, list[str]]] = process_shop_data(example_data)
Слишком много кода, не так-ли? Именно в таких случаях и стоит применять типы псевдонимов.