mypy: не удается заставить MYPYPATH работать в Windows Powershell

Я изо всех сил пытаюсь установить MYPYPATH, чтобы mypy разрешал модули, которые не находятся в том же каталоге, что и моя основная программа. (Это нормально, если они находятся в одном каталоге).

Я работаю в PowerShell в Windows 10. Полный пример ниже. Может ли кто-нибудь сказать мне точное значение, которое я должен установить для MYPYPATH? Я пробовал все варианты, которые только мог придумать: относительный путь, абсолютный путь, пути с '/' '\' и '\\'. Я прочитал mypy docs.

Вот мои файлы:

C:\USERS\GARETH\MYPY
├───modules
│       utils.py
│
└───tests
        utils_test.py

utils.py:

def ff(x: str) -> str:
    return "Hello " + x

utils_test.py:

from modules.utils import ff

print(ff("world")) # OK
ff(42) # error

Вот мой сеанс PowerShell. Python находит модуль и выдает ошибку выполнения (как и ожидалось):

PS C:\Users\Gareth\Mypy\tests> $env:PYTHONPATH
..
PS C:\Users\Gareth\Mypy\tests> python .\utils_test.py
Hello world
Traceback (most recent call last):
  File ".\utils_test.py", line 8, in <module>
    ff(42) # error
  File "C:\Users\Gareth\Mypy\modules\utils.py", line 3, in ff
    return "Hello " + x
TypeError: can only concatenate str (not "int") to str

Каким бы ни было значение MYPYPATH, mypy не может найти модуль:

PS C:\Users\Gareth\Mypy\tests> $env:MYPYPATH
..
PS C:\Users\Gareth\Mypy\tests> mypy .\utils_test.py
utils_test.py:1: error: Cannot find module named 'modules.utils'
utils_test.py:1: note: See 
https://mypy.readthedocs.io/en/latest/running_mypy.html#missing-imports

Кто-нибудь может сказать мне точное значение, которое я должен установить для MYPYPATH? Это последний mypy:

PS C:\Users\Gareth\Mypy\tests> mypy --version
mypy 0.660

person gareth    schedule 06.02.2019    source источник
comment
У меня нет компьютера с Windows, чтобы проверить это, но я подозреваю, что проблема связана не столько с MYPYPATH, сколько с другим, потому что mypy по умолчанию не поддерживает модули пространства имен (модули, в которых отсутствует файл __init__.py). Я бы попытался повторить ваши эксперименты MYPYPATH либо после добавления файла modules/__init__.py, либо при использовании флага --namespace-packages (документы здесь) и посмотрите, поможет ли это.   -  person Michael0x2a    schedule 06.02.2019
comment
@ Michael0x2a Спасибо, Майкл, добавление флага --namespace-packages немедленно работает! Я не знал, что возникла проблема с «модулями пространства имен». Кажется, mypy более разборчив в этом, чем сам python. Если вы хотите написать это как ответ, я приму это. Ваше здоровье.   -  person gareth    schedule 07.02.2019
comment
@ Michael0x2a Помещение пустого __init__.py в каталог модулей также работает.   -  person gareth    schedule 07.02.2019


Ответы (1)


Я отвечаю на свой вопрос на основе комментария Michael0x2a.

В моем примере переменная окружения $ env: MYPYPATH = ".." отлично работает при импорте из modules.utils.

Проблема в том, что MyPy более требователен, чем сам python, в отношении распознавания файлов .py как модулей. Вы должны либо поместить файл с именем __init__.py (который может быть пустым) в каталог модулей, либо запустить mypy с флагом --namespace-packages:

PS C:\Users\Gareth\Mypy\tests> mypy --namespace-packages .\utils_test.py
person gareth    schedule 15.02.2019