【发布时间】:2019-05-19 05:15:15
【问题描述】:
给定
class A:
pass
class B:
pass
如果我定义一个新的ACallback 类型,它采用A 的实例
from typing import Callable
ACallback = Callable[[A], None]
并定义一个接受B实例的函数
def b_callback(b: B):
pass
如果我尝试在预期使用ACallback 的地方使用b_callback,我会收到类型提示警告 - 正如预期的那样。
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 类型提示限制?
- 还有别的吗?
【问题讨论】:
-
你用什么做类型分析? PyCharm 内置处理?到目前为止,mypy 在我的测试中似乎可以很好地处理装饰器。
-
这是一个已知的issue
标签: python python-3.x pycharm type-hinting