当使用 self.__class__() 返回 class Foo 的实例时,为什么 PyCharm 认为类型应该是 Optional[Type[Foo]]?

When returning an instance of class Foo using self.__class__(), why does PyCharm think the type should be Optional[Type[Foo]]?

我有一个 class Foo,它有一个 return 另一个 Foo 实例的方法。

from __future__ import annotations

class Foo:
    def get_other_foo(self) -> Foo:
        return self.__class__()

__future__ 导入是为了使方法上的 Foo 注释在 Python 3.7 中工作。)

这有效,MyPy 不会在文件中标记任何错误。但是,PyCharm 以黄色突出显示 return 值,当我将鼠标悬停在它上面时,我收到警告 "Expected type 'Foo', got 'Optional[Type[Foo]]' instead".

我考虑过在方法中对 Foo 进行硬编码,如下所示:

from __future__ import annotations

class Foo:
    def get_other_foo(self) -> Foo:
        return Foo()

这也有效,并使 PyCharm 警告静音。但是,在 subclass 中,这将 return Foo 的实例而不是 subclass 的实例,所以我不愿意这样做。

为什么 PyCharm 认为 return 类型在我的第一个例子中应该是 Optional[Type[Foo]]?当从 subclass 调用时,有没有办法修复 PyCharm 警告,同时保持 get_other_foo() 到 return subclass 实例的能力?

这是一个已知问题https://youtrack.jetbrains.com/issue/PY-37935,请投票!