Skip to content

Latest commit

 

History

History
99 lines (81 loc) · 4.16 KB

Типы_псевдонимов.md

File metadata and controls

99 lines (81 loc) · 4.16 KB

2.3 Типы псевдонимов

В 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)

Слишком много кода, не так-ли? Именно в таких случаях и стоит применять типы псевдонимов.