Использование 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, ...

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