Подсказки типа не оценивают в декораторах - PullRequest
0 голосов
/ 18 декабря 2018

Дано

class A:
    pass

class B:
    pass

Если я определяю новый тип ACallback, который принимает экземпляр A

from typing import Callable

ACallback = Callable[[A], None]

И определяю функцию, которая принимает экземпляр B

def b_callback(b: B):
    pass

Если я пытаюсь использовать b_callback там, где ожидается ACallback, я получаю предупреждения о подсказках типа - как и ожидалось.

def test(callback: ACallback):
    pass


test(the_callback)  # <-- "Expected type '(A) -> None', got '(b: B) -> None` instead

Однако, если я создаю декораторкоторый принимает ACallback

def test2(callback: ACallback):
    def decorate(f):
        def new_f(*args, **kwargs):
            return f(*args, **kwargs)
        return new_f
    return decorate

и передает функцию, которая не соответствует

@test2(the_callback)  # <-- No type hint errors
def decorator_test():
    pass

Я не вижу предупреждений о подсказках типов.

Вопрос: Отсутствует ли предупреждение о подсказке типа из-за ...

  • Ошибки подсказки типа?
  • Ограничения подсказки типа Python?
  • Ограничения подсказок типа PyCharm?
  • Что-то еще?

1 Ответ

0 голосов
/ 18 декабря 2018

Это похоже на ошибку (или «отсутствие функции») в PyCharm.Я пробовал эту программу:

import typing

ACallback = typing.Callable[[int], None]

def test2(callback: ACallback):
    def decorate(f):
        def new_f(*args, **kwargs):
            return f(*args, **kwargs)
        return new_f
    return decorate


def foo(s: str):
    pass


test2(foo)


@test2(foo)
def bar():
    pass

с последней версией mypy, и результаты были

decorated.py:17: error: Argument 1 to "test2" has incompatible type "Callable[[str], Any]"; expected "Callable[[int], None]"
decorated.py:20: error: Argument 1 to "test2" has incompatible type "Callable[[str], Any]"; expected "Callable[[int], None]"

, т.е. оба использования привели к ошибке.


Если вы хотите использовать его с PyCharm, есть как минимум 2 разных плагина для интеграции с PyCharm;один с именем mypy , а другой - Dropbox , который недоступен через репозиторий JetBrains .

Я бы посчитал DropBox одним«официальный плагин, одобренный mypy» в том смысле, что все ключевые люди, намекающие на mypy / Python, работают в Dropbox ...

...