Почему список не может содержать несколько типов? - PullRequest
0 голосов
/ 28 ноября 2018

Вы можете смешивать типы внутри кортежей или списков.Почему вы не можете указать это в подсказках?

>>> from typing import Tuple, List
>>> t = ('a', 1)
>>> l = ['a', 1]

>>> t2: Tuple[str, int] = ('a', 1)
>>> l2: List[str, int] = ['a', 1]

TypeError: Too many parameters for typing.List; actual 2, expected 1

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

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

Однако теория типов также предоставляет типы сумм, которые можно рассматривать как обертку вокруг ровно одногозначение выбрано из некоторого фиксированного набора типов.Тип суммы поддерживается typing.Union.Чтобы указать, что список представляет собой сочетание значений int и str, используйте

List[Union[str, int]]

в качестве подсказки типа.

В отличие от этого, кортеж является примером тип продукта , тип, состоящий из фиксированного набора типов, значения которого представляют собой набор значений, по одному от каждого типа в типе продукта.Tuple[int,int,int], Tuple[str,int] и Tuple[int,str] - все это разные типы, различающиеся как числом типов в продукте, так и порядком их появления.

0 голосов
/ 28 ноября 2018

Вы могли бы использовать Union, но обычно, если вы можете избежать этого, списки должны быть однородными, а не гетерогенными:

from typing import List, Union
lst: List[Union[str, int]] = [1, 'a']

myp, по крайней мере,приму это просто отлично.

Это означает, что, однако, ваши средства доступа к списку будут возвращать тип Union, часто требуя обработки различных возможных типов в любых последующих функциях.Принятие союзов, как правило, менее проблематично.

...