【发布时间】:2021-02-21 21:56:20
【问题描述】:
from typing import Callable
class SuperClass:
pass
class SubClass(SuperClass):
pass
def a_function(another_function: Callable[[SuperClass], None]):
pass
def superclass_callable(temp: SuperClass) -> None:
pass
def subclass_callable(temp: SubClass) -> None:
pass
a_function(superclass_callable)
a_function(subclass_callable)
superclass_callable(SuperClass())
superclass_callable(SubClass())
在上面的代码中,PyCharm 突出显示a_function(subclass_callable) 并告诉我Expected type '(SuperClass) -> None, got '(temp: SubClass) -> None' instead。我在搜索中看到的所有内容都表明类型提示应该接受子类,所以我无法弄清楚这里出了什么问题。 PyCharm 不会抱怨该函数是否仅将超类或它们的列表作为参数,只要它是可调用的,据我所知。例如,最后两行都没有问题。
【问题讨论】:
-
我的大脑被工作炒得焦头烂额,所以这可能不是答案,但请参阅here。
-
因为
Callable在其参数上是逆变,并且在返回类型上是协变的。在这里阅读更多:python.org/dev/peps/pep-0483/#covariance-and-contravariance -
谢谢两位。那真的很有帮助。在我的用例中,以另一种方式工作更有意义,但 PEP 文档中的示例非常清楚地说明了为什么它以另一种方式工作。我认为就我而言,我实际上可能想使用通用
标签: python-3.x pycharm