В чем преимущество использования библиотечных классов и типов в подсказках типов 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
предназначены для переноса задач), потому что псевдонимы типов будут использовать их только в качестве "листового" типа, а не корневого типа или типа ветви.