Использование локальных заглушек Mypy

Я пытаюсь ввести подсказку, введенную в Python 3.5, и у меня возникла проблема с использованием локальных заглушек в качестве подсказки для ввода с помощью mypy.

Я провожу эксперимент по созданию kk.py, содержащего

def type_check(a):
    pass

Кроме того, я положил kk.pyi, содержащий

def type_check(a: int):...

в том же каталоге. Таким образом, я попытался вызвать ошибку «ncompatible types in assignment», передав строку в type_check в kk.py. Однако когда я запустил mypy kk.py и не получил ошибки.

Таким образом, я попробовал другой способ, который предлагает mypy doc, а именно установить для переменной окружения MYPYPATH значение ~ / some / path / stub и поместить kk.pyi в каталог. Однако у меня такая же ошибка.

Кто-нибудь может мне в этом помочь?

Вот вики mypy о том, как использовать локальный заглушка.


person Musen    schedule 31.05.2016    source источник
comment
Нашел причину и решение здесь: github.com/python/mypy/issues/5520 # issuecomment-426371485   -  person Pragy Agarwal    schedule 11.10.2018


Ответы (1)


Я не знаю, почему кто-то проголосовал против этого вопроса, не ответив на него или не комментируя, почему он / она ему не понравился, но вот ответ, который я понял:

Заглушка mypy работает только при импорте модуля. Таким образом, если у вас есть

def try_check(a):
    pass

в кк.пы, а

def try_check(a: int):...

в kk.pyi в том же каталоге с kk.py или в каталоге, который указывает MYPYPATH, mypy введет проверку файла python, если вы импортируете kk. Это если у вас есть

import .kk
kk.try_check('str')

в test.py и запустите mypy test.py, mypy сообщит о конфликте типов. Однако он не сообщит о конфликте, если у вас

try_check('str')

in kk.py.

Вы можете ввести проверочные функции в программу, которая содержит определение функции, если вы напишете подсказку набора явно в определении функции. Например, вы можете написать

def try_check(a: int):
    pass

try_check('str')

в kk.py, а затем mypy kk.py. Mypy сообщит о конфликте типов.

person Musen    schedule 14.06.2016
comment
Спасибо! Я боролся именно с этой проблемой. Я действительно не понимаю, почему mypy так работает. Любые идеи? - person Solomon Bothwell; 19.09.2017
comment
@SolomonBothwell Я чувствую первую попытку создать эту программу статической проверки для большого модуля, такого как Django, поэтому предполагается, что пользователь будет проверять что-то в пакете, а не в самописных программах. - person Musen; 19.09.2017
comment
Вы можете абсолютно точно проверять типы ваших собственных программ, просто нет необходимости или причин использовать отдельные файлы-заглушки. Если ваша программа импортирует стороннюю библиотеку, у которой нет аннотаций, но вы хотите их использовать, тогда вам нужны локальные заглушки. - person OJFord; 25.11.2017
comment
@OJFord уверен, как показывает документация, мы справимся. Однако суть этого поста в том, КАК это можно сделать с отдельным файлом-заглушкой, а не ПОЧЕМУ мы хотим это сделать. - person Musen; 28.11.2017
comment
@OJFord также я бы предпочел использовать локальные заглушки вместо набора текста на месте, так как синтаксис в его текущем состоянии довольно раздут, и это делает код неприятным для чтения. Не говоря уже о циклическом импорте и обходных приемах, которые вам нужно применить в случае более сложных подсказок. - person Szabolcs; 12.07.2019