Использование List/Tuple/etc. от ввода против прямого обращения к типу как список / кортеж / и т.д.
Какая разница в использовании List
, Tuple
и т. д. из typing
модуль:
from typing import Tuple
def f(points: Tuple):
return map(do_stuff, points)
В отличие от прямой ссылки на типы Python:
def f(points: tuple):
return map(do_stuff, points)
И когда я должен использовать один поверх другого?
3 ответа
typing.Tuple
а также typing.List
являются родовыми типами; это означает, что вы можете указать, какой тип их содержимого должен быть:
def f(points: Tuple[float, float]):
return map(do_stuff, points)
Это указывает, что передаваемый кортеж должен содержать два float
ценности. Вы не можете сделать это с помощью встроенного tuple
тип.
typing.Tuple
Особенность здесь в том, что она позволяет вам указать определенное количество ожидаемых элементов и тип каждой позиции. Используйте многоточие, если длина не установлена и тип должен быть повторен: Tuple[float, ...]
описывает переменную длину tuple
с float
s.
За typing.List
и другие типы последовательностей, которые вы обычно указываете только для всех элементов; List[str]
список строк любого размера. Обратите внимание, что функции должны преимущественно принимать type.Sequence
в качестве аргументов и typing.List
обычно используется только для возвращаемых типов; Вообще говоря, большинство функций принимают любую последовательность и выполняют только итерации, но когда вы возвращаете list
вы действительно возвращаете определенный, изменяемый тип последовательности.
Вы всегда должны выбрать typing
дженерики, даже если вы в настоящее время не ограничиваете содержание. Проще добавить это ограничение позже с универсальным типом, поскольку результирующее изменение будет меньше.
Начиная с Python 3.9 (PEP 585)tuple
, list
и различные другие классы теперь являются универсальными типами. Используя эти, а не ихtyping
коллега теперь предпочтительнее. Из Python 3.9 теперь вы можете просто делать:
def f(points: tuple[float, float]):
return map(do_stuff, points)
Если вам не нужно оценивать подсказки типа, вы можете использовать этот синтаксис в Python 3.7+ из-за PEP 563.
from __future__ import annotations
def f(points: tuple[float, float]):
return map(do_stuff, points)
Вы всегда должны выбирать не-typing
по возможности универсальный, как старый typing.Tuple
, typing.List
и другие дженерики устарели и будут удалены в более поздней версии Python.
Импорт из
typing
устарела. Из-за PEP 563 и намерения минимизировать влияние ввода во время выполнения, это устаревание не будет генерировать DeprecationWarnings. Вместо этого средства проверки типов могут предупреждать о таком устаревшем использовании, когда целевая версия проверяемой программы получает сигнал Python 3.9 или новее. Рекомендуется разрешить отключение этих предупреждений для всего проекта.Устаревшие функции будут удалены из модуля набора текста в первой версии Python, выпущенной через 5 лет после выпуска Python 3.9.0.
вкратце; доктор:
Начиная с Python 3.9, вводите псевдонимы, напримерList
,Tuple
,Dict
, ... устарели .
Итак, с этого момента используйте встроенные типыlist
,tuple
,dict
, ...