Collection.Iterable vs typing.Iterable в аннотации типов и проверке на Iterable

Я обнаружил, что в Python как collections.Iterable, так и typing.Iterable можно использовать в аннотации типов и проверять, является ли объект итерируемым, т.е. работают как isinstance(obj, collections.Iterable), так и isinstance(obj, typing.Iterable). У меня вопрос, в чем разница между ними? И какой из них предпочтительнее в каких ситуациях?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
26
0
7 613
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

typing.Iterable является универсальным, поэтому вы можете указать, что это за итерация, в аннотациях вашего типа, например Iterable[int] для итерации целых чисел.

Итерируемые коллекции - это абстрактный базовый класс. Они могут включать дополнительные методы микширования, чтобы упростить реализацию интерфейса при создании собственных подклассов.

Так получилось, что Iterable не включает ни один из этих миксинов, но является частью интерфейса других абстрактных базовых классов, которые включают.

Теоретически итеративная типизация работает для обоих, но для этого используется какая-то странная магия метаклассов, поэтому они не во всех случаях ведут себя одинаково. Вам действительно не нужны универсальные шаблоны во время выполнения, поэтому нет необходимости использовать их вне аннотаций типов и тому подобного. Итерируемые коллекции с меньшей вероятностью будут вызывать проблемы в качестве суперкласса.

Короче говоря, вы должны использовать итерацию ввода в аннотациях типов, но коллекции итерацию как суперкласс.


Обновлять:

Благодаря PEP 585, начиная с версии 3.9, стандартные библиотечные типы контейнеров Python также смогут принимать универсальный аргумент для аннотаций типов. Сюда входит класс collections.abc.Iterable. При поддержке только Python 3.9 или новее, больше нет никаких причин использовать typing.Iterable, и импорт любого из этих типов контейнеров из typing будет устаревшим.

Чтобы добавить к вашему мнению о Pep 585, typing.List[T] будет заменен просто list[T]

BallpointBen 22.02.2021 17:20

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