Что означает typing.List‹~T›[typing.Tuple[int]] в библиотеке ввода Python?

Играя с модулем Python typing, я наткнулся на кое-что любопытное:

>>> from typing import List, Tuple
>>> List[Tuple[int]]
typing.List<~T>[typing.Tuple[int]]

Что это за Java-подобный синтаксис List<~T>? Что это значит?


person bjd2385    schedule 07.11.2016    source источник
comment
Что вы имеете в виду откуда это?   -  person jonrsharpe    schedule 07.11.2016
comment
List<~T> — это просто список общего типа T, основанный на исходный код ~ не указывает ни на ко-, ни на контр-вариант.   -  person jonrsharpe    schedule 07.11.2016


Ответы (2)


Давайте посмотрим:

typing.List<~T>[typing.Tuple[int]]
  1. typing.List означает тип из библиотеки typing с именем List.
  2. <~T> означает, что этот тип является универсальным, он определен в терминах другого типа T
  3. [typing.Tuple[int]] означает, что тип T является типом Tuple[int].

На естественном языке определение можно прочитать так:

typing.List<~T>[typing.Tuple[int]]: стандартный список одноцелых кортежей

person slezica    schedule 07.11.2016

Это не реальный синтаксис Python, поэтому не пытайтесь использовать его в программе. Тем не менее, именно так они решили представлять параметры типа универсального типа. В repr обобщенного типа объявленные параметры типа перечислены в Java-подобных <> угловых скобках с +, - или ~ перед каждым параметром типа в зависимости от того, является ли этот параметр ковариантным, контравариантным или ни тем, ни другим.

typing.List принимает один нековариантный, неконтравариантный параметр типа с именем T, поэтому он получает <~T> после имени.

Вы заметите, что после имени typing.Tuple нет ничего <>. Tuple — странный частный случай, так как он принимает переменное количество параметров типа.

person user2357112 supports Monica    schedule 07.11.2016
comment
Обозначения <~T> / <+T> / <-T> исчезли из python с версии 3.6. Теперь он просто печатает typing.List[typing.Tuple[int]], так что вы не можете увидеть его дисперсию. Я не мог найти проблему, связанную с этим, иначе я бы попросил вернуть его :) - person max; 16.04.2017