Обнаружение ошибок типа с использованием mypy без аннотаций типов - PullRequest
0 голосов
/ 25 апреля 2018

Следующий скрипт содержит преднамеренную ошибку типа:

def foo(x, y):
    print(x[:y])

def main():
    foo('abcde', '2')

if __name__ == "__main__":
    main()

Ошибка может быть подтверждена запуском:

$ python3 untyped_test.py 
Traceback (most recent call last):
  File "untyped_test.py", line 8, in <module>
    main()
  File "untyped_test.py", line 5, in main
    foo('abcde', '2')
  File "untyped_test.py", line 2, in foo
    print(x[:y])
TypeError: slice indices must be integers or None or have an __index__ method

Однако я надеялся поймать что-то подобное не тольково время выполнения, но перед выполнением кода, используя:

mypy --check-untyped-defs untyped_test.py 

Но он не находит ошибок:

$ mypy --check-untyped-defs untyped_test.py 
$ mypy --version
mypy 0.590

Только когда я комментирую foo:

def foo(x: str, y: int):
    print(x[:y])

Я получаю:

untyped_test.py:5: error: Argument 2 to "foo" has incompatible type "str"; expected "int"

Можно ли найти подобные ошибки без каких-либо ручных аннотаций типа?

1 Ответ

0 голосов
/ 25 апреля 2018

Это невозможно сделать в mypy. Mypy следует семантике PEP 484 , которая гласит, что если параметры функции не аннотированы, предполагается, что они имеют тип Any, что представляет полностью динамическое значение неизвестного типа.

Это дизайнерское решение является преднамеренным. Отчасти это связано с тем, что сделать вывод типа всей программы довольно сложно, особенно если вы разрешаете объекты, подтипирование, изменчивость и т. Д.: Запрос пользователя исправить типы на «границе» помогает сделать хинтинг типов доступным.

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

Тем не менее, есть некоторые люди, которые пытаются реализовать вывод типа всей программы - см., Например, проект pytype . Тем не менее, я понимаю, что это все еще очень в стадии альфа.

...