В чем преимущество использования библиотечных классов и типов в подсказках типов Python?

Я начинаю изучать подсказки типов в Python для облегчения будущего переноса кода с Python на C. Мне интересно, в чем разница, если есть, между использованием типов непосредственно в подсказках типов и использованием классов, определенных в typing модуль.

Например, разница между

def somefn(a: list[int]) -> tuple[str, int]:
    ...

а также

from typing import List, Tuple

def somefn(a: List[int]) -> Tuple[str, int]:
    ...

Кажется, что некоторые классы, такие как Union, Any, Callable, а также Iterable было бы полезно, но полезность классов для типов данных, которые уже существуют в Python как ключевые слова, мне неясна.

1 ответ

Решение

Это полезно для написания аннотаций, которые могут быть оценены юридически; list[int] взорвется, если вы попытаетесь на самом деле запустить его, в то время как typing.List[int] возвращает новый универсальный тип, который знает тип как контейнера, так и содержимого. Это особенно важно в случае псевдонимов типов, где на верхнем уровне определяется специализированная версия универсального шаблона, а затем повторно используется в качестве аннотации далее:

Vector = List[float]
def scale(scalar: float, vector: Vector) -> Vector:
     ...

законно, пока:

Vector = list[float]
def scale(scalar: float, vector: Vector) -> Vector:
     ...

взрывается на вашем лице. Вы заметите, что неконтейнерные / универсальные типы обычно не имеют typing тип (исключения как Text предназначены для переноса задач), потому что псевдонимы типов будут использовать их только в качестве "листового" типа, а не корневого типа или типа ветви.

Другие вопросы по тегам