Почему mypy не работает на этом автоматически аннотируемом модуле MonkeyType? - PullRequest
0 голосов
/ 20 февраля 2020

Предположим, что следующий модуль и файл сценария:

mymodule.py

# Module to be annotated by MonkeyType
def add(a, b):
    return a + b

myscript.py

from mymodule import add

add(2, 3)
add('x', 'y')

Автоматически комментируйте модуль с помощью Модуль MonkeyType , использующий терминал Ubuntu.

$ monkeytype run myscript.py
$ monkeytype apply mymodule

mymodule.py теперь изменяется с добавленными аннотациями.

# Module annotated by monkeytype
from typing import Union

def add(a: Union[int, str], b: Union[int, str]) -> Union[int, str]:
    return a + b

Но если я запускаю mypy, проверка типа stati c, выполнение завершается с 2 ошибками. Почему это происходит?

$ mypy mymodule.py
mymodule.py:4: error: Unsupported operand types for + ("int" and "str")
mymodule.py:4: error: Unsupported operand types for + ("str" and "int")
mymodule.py:4: note: Both left and right operands are unions
Found 2 errors in 1 file (checked 1 source file)

Кстати, я использую arch Python 3.8.

1 Ответ

1 голос
/ 23 февраля 2020

Нет никакой гарантии, что аннотации типов, которые MonkeyType будет создавать, обязательно правильны: вывод типов с использованием информации времени выполнения - это метод, имеющий несколько фундаментальных ограничений.

Цитировать файл readme:

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

В этом конкретном случае типы являются неправильными, поскольку сигнатура типа подразумевает выполнение add("foo", 3), хотя это и нормально. в конечном итоге вызовет cra * sh во время выполнения: вы не можете добавлять строки и целые числа вместе.

...