Обертывание функции декоратором не позволяет mypy проверить ее правильно.Python

Программы на Python
Ответить
Anonymous
 Обертывание функции декоратором не позволяет mypy проверить ее правильно.

Сообщение Anonymous »

Недавно я обнаружил, что обертывание функции с помощью декоратора скрывает ее подпись от mypy и предотвращает ее правильную проверку типов. Этот код воспроизводит это поведение (с Python 3.12 и последней версией mypy).

Код: Выделить всё

import functools

def myWrapper(func): # type: ignore
@functools.wraps(func)
def f(*args, **kwargs): # type: ignore
return func(*args, **kwargs)
return f

@myWrapper
def hello(text: str, n: int = 1) -> str:
return "hello world"

def helloNoWrap(text: str, n: int = 1) -> str:
return "hello world"

print(hello.__annotations__)
print(helloNoWrap.__annotations__)

hello("hello", 5, 4)
helloNoWrap("hello", 5, 4)
Выполнение этого кода дает следующий результат:

Код: Выделить всё

{'text': , 'n': , 'return': }
{'text': , 'n': , 'return': }
Traceback (most recent call last):
File "/Users/davidpitchford/repos/crawler/test_typing.py", line 19, in 
hello("hello", 5, 4)
File "/Users/davidpitchford/repos/crawler/test_typing.py", line 6, in f
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
TypeError: hello() takes from 1 to 2 positional arguments but 3 were given
Запуск mypy дает следующий результат:

Код: Выделить всё

test_typing.py:20: error: Too many arguments for "helloNoWrap"  [call-arg]
Found 1 error in 1 file (checked 1 source file)
Mypy обнаруживает только неправильное количество аргументов при вызове helloNoWrap, хотя hello имеет точно такие же аннотации. Почему это? Я думал, что mypy просматривает аннотации для проверки типов, но это явно не единственное, что он проверяет.

Подробнее здесь: https://stackoverflow.com/questions/793 ... t-properly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»