【问题标题】:Why does Pycharm complain about subclass in Callable with type hints?为什么 Pycharm 抱怨带有类型提示的 Callable 中的子类?
【发布时间】: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


【解决方案1】:

你使用什么 Python 版本? 你可以在这里提交你的问题?: https://youtrack.jetbrains.com/issues/PY

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2012-01-14
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多