我正在使用协议来定义一些基类
我只想继承父协议并自动检查子协议类型。
这是示例代码:
class Child(Protocol):
name: str
class Parent(Protocol):
Child: Child
class FooBar(Parent):
class Child:
pass
# No Error
为什么 Mypy/Pylance 没有推断出
Child
协议需要 name
这是
mypy
中的已知限制,这是相应的 issue。正如评论中指出的,Pyright 正确检测到这种类型违规。如果您在外部定义类型并分配,mypy
也会识别错误:
from typing import Protocol
class Child(Protocol):
name: str
class Parent(Protocol):
Child: Child
class _Child:
pass
class FooBar(Parent):
Child = _Child # E: Incompatible types in assignment (expression has type "type[_Child]", base class "Parent" defined the type as "Child") [assignment]