给出
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
我没有看到任何类型提示警告。
问题:是由于...引起的类型提示警告不足
答案 0 :(得分:2)
这似乎是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,即not available via JetBrains repository。
在all the key mypy/Python type hinting people are employed by Dropbox ...
的意义上,我将DropBox视为“官方的mypy认可的插件”。