тип подсказок для метода MutableMapping pop ()

К сожалению, на момент написания этой статьи DESPITE их собственное чтение readme, no src.zip в каталогах установки JDK 7 или 8 при загрузке версии Windows .

Примечание: возможно, это происходит, потому что многие из нас фактически не запускают программу .exe, а вместо этого извлекают ее. Многие из нас не запускают установку Java (полностью взорванные окна) по соображениям безопасности .... мы просто хотим, чтобы JDK помещал где-то в место, где потенциальные вирусы не могут его найти.

Но их политика относительно Windows .exe (что бы это ни было на самом деле) действительно гайки, HOWEVER , src.zip DOES существуют в установке linux (a .tar.gz) , Существует несколько способов извлечения .tar и .gz, и я предпочитаю бесплатную утилиту «7Zip».

  1. загружает 64-битный Linux .tar.gz
  2. используйте 7zip для распаковки .tar.gz в .tar
  3. используйте 7zip для извлечения .tar в каталог установки
  4. src.zip будет ждать вас в этом каталоге установки .
  5. вытащите его и поместите туда, где хотите.

Oracle, это действительно глупо.

0
задан Rick Teachey 13 July 2018 в 22:07
поделиться

1 ответ

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

Для MutableMapping можно указать только два параметра: _KT и _VT. Этот дополнительный параметр _T остается неуказанным. Как проверяет тип этого третьего типа ...?

Поскольку в основном @jonrsharpe _T, не параметр типа класса, это параметр типа функции. В основном, когда вы вызываете этот метод, mypy будет иметь:

  1. Уже привязанные _KT и _VT к другому типу. Итак, если мы сделаем foo: MutableMapping[str, int] = ..., тогда позвоним foo.pop(...), mypy поймет, что _KT и _VT привязаны к str и int соответственно в момент, когда мы вызываем pop.
  2. Mypy дополнительно замечает, что у нас есть свободный (параметр aka unbound ), плавающий вокруг, если мы вызываем вторую перегрузку. Затем он попытается вывести , какой правильный тип _T основан на любом значении, которое мы передаем в / окружающем контексте. Например, предположим, что я foo.pop("x", "bar"). Это соответствует второй перегрузке. Мы также ранее говорили, что _KT и _VT связаны с str и int соответственно. Затем Мига замечает, что _T несвязана и пытается вывести соответствующий тип. Здесь мы знаем, что значение, которое мы передаем, имеет тип «str» и что тип параметра Union[int, _T] (после подстановки в связанных типах). Мы также знаем, что значение, которое мы передаем, должно быть подтипом параметров - мы знаем, что str должен быть подтипом Union[int, _T]. Затем Mypy запускает алгоритм вывода с использованием всех вышеперечисленных сведений / всех известных ограничений и в этом случае может сделать вывод, что _T должен иметь тип str.

( В качестве побочного примечания алгоритм вывода алгоритма Mpy здесь не идеален. Иногда он может вывести правильный тип, если выражение особенно сложно / в настоящее время неправильно обрабатывает некоторые случаи краев.)

Если вы хотите получить более подробное описание того, как работает алгоритм вывода типа mypy, вы можете попробовать spelunking через кодовую базу mypy. В частности, mypy вызывает эту функцию , которая в свою очередь вызывает здесь код . Справедливое предупреждение, это немного сложно понять.

В этом контексте ковариант возвращаемого типа _T ...?

Мы знаем здесь, что _KT, _VT и _T все инварианты, основанные на их определении .

Каждая из трех переменных типа может быть полностью независимой друг от друга. Это соответствует поведению runtime: если у меня есть Dict[str, str], то выполнение my_dict.pop("x", 4) может вернуть какую-либо строку или число 4 в зависимости от того, что именно содержит my_dict.

Имеет ли тип возврата должны быть того же типа, что и по умолчанию, или только совместимого подтипа?

. Таким образом, полностью исключая генерики, вот (упрощенные) правила перегрузки с mypy 0.620. (В старых версиях mypy использовался аналогичный, но более пушистый, ad-hoc алгоритм).

  1. По умолчанию mypy позволит полностью возвращать типы возвращаемых двух перегрузок: им не нужно чтобы иметь какое-либо неотъемлемое отношение друг к другу.
  2. Mypy, однако, запретит неотъемлемо небезопасные определения перегрузки. Два варианта перегрузки считаются небезопасными, если: все аргументы первого варианта совместимы со вторым. Тип возврата первого варианта не совместим с (например, не подтипом) второго. В конкретном случае pop аргументы первого варианта действительно совместимы со вторым: по какой-либо причине аргумент default помечен как необязательный. Это означает, что вызов foo.pop("x") может фактически соответствовать обеим перегрузкам. Однако первый тип возврата первого варианта варианта перегрузки является подтипом второго: _VT является подтипом Union[_VT, _T], независимо от того, что заканчивается _T.
  3. Когда вы на самом деле вызываете перегрузку, mypy проверяет доступные перегрузки в том порядке, в котором они определены, и использует первый вариант, который соответствует. Чтобы убедиться, что этот алгоритм работает так, как ожидалось, mypy сообщит об ошибке, если перегрузки определены таким образом, что невозможно, чтобы некоторые варианты были сопоставлены.

Эти правила не действительно изменяются значительным образом, если мы добавим дженерики в микс.

В документации есть более подробные сведения / дополнительные примеры о нюансах перегрузки функций .

1
ответ дан Michael0x2a 17 August 2018 в 12:07
поделиться
  • 1
    Отлично. Много подробная информация, чтобы учиться лучше. Любить это. – Rick Teachey 16 July 2018 в 04:02
Другие вопросы по тегам:

Похожие вопросы: