Играя с модулем Python typing
, я наткнулся на кое-что любопытное:
>>> from typing import List, Tuple
>>> List[Tuple[int]]
typing.List<~T>[typing.Tuple[int]]
Что это за Java-подобный синтаксис List<~T>
? Что это значит?
Играя с модулем Python typing
, я наткнулся на кое-что любопытное:
>>> from typing import List, Tuple
>>> List[Tuple[int]]
typing.List<~T>[typing.Tuple[int]]
Что это за Java-подобный синтаксис List<~T>
? Что это значит?
Давайте посмотрим:
typing.List<~T>[typing.Tuple[int]]
typing.List
означает тип из библиотеки typing
с именем List
.<~T>
означает, что этот тип является универсальным, он определен в терминах другого типа T[typing.Tuple[int]]
означает, что тип T является типом Tuple[int]
.На естественном языке определение можно прочитать так:
typing.List<~T>[typing.Tuple[int]]
: стандартный список одноцелых кортежей
Это не реальный синтаксис Python, поэтому не пытайтесь использовать его в программе. Тем не менее, именно так они решили представлять параметры типа универсального типа. В repr
обобщенного типа объявленные параметры типа перечислены в Java-подобных <>
угловых скобках с +
, -
или ~
перед каждым параметром типа в зависимости от того, является ли этот параметр ковариантным, контравариантным или ни тем, ни другим.
typing.List
принимает один нековариантный, неконтравариантный параметр типа с именем T
, поэтому он получает <~T>
после имени.
Вы заметите, что после имени typing.Tuple
нет ничего <>
. Tuple
— странный частный случай, так как он принимает переменное количество параметров типа.
<~T>
/ <+T>
/ <-T>
исчезли из python с версии 3.6. Теперь он просто печатает typing.List[typing.Tuple[int]]
, так что вы не можете увидеть его дисперсию. Я не мог найти проблему, связанную с этим, иначе я бы попросил вернуть его :)
- person max; 16.04.2017
List<~T>
— это просто список общего типаT
, основанный на исходный код~
не указывает ни на ко-, ни на контр-вариант. - person jonrsharpe   schedule 07.11.2016