在以下代码中,PyCharm 对
Base.foo
发出键入警告(“预期返回 'int',没有返回”),但对 Base.bar
不发出键入警告,它具有完全相同的键入提示和返回类型:
import abc
class Base(abc.ABC):
@abc.abstractmethod
def foo(self) -> int:
print('fooing')
pass
@abc.abstractmethod
def bar(self) -> int:
pass
class Derived(Base):
def foo(self) -> int:
return 42
def bar(self) -> int:
return 42
实际上,
Base.foo
和Base.bar
都不能直接调用,所以我希望那里不会出现任何输入警告。另一方面,如果在 return super().foo()
中输入 Derived.foo
,那么确实应该发出打字警告,但同样的情况也应该适用于 Derived.bar
,所以我仍然不明白为什么会有不同的行为。有人可以解释一下,还是这是 PyCharm 中的一个错误?
Base.foo
can 可以从 foo
的其他正确覆盖中调用。您的类型检查器不会跟踪代码的执行以确保 Base.foo
isn't 被调用:您可以拥有类似 的代码
class Derived2(Base):
def foo(self) -> int:
return 42 + super().foo()
需要
Base.foo
返回 int
。