return python 通用 属性 用法的不兼容 return 值类型 return 自身
Incompatible return value type of python generic property usage that returns self
尝试实现尊重 mypy
的节点和树继承层次结构,我有下一个 类:
from __future__ import annotations
import dataclasses
from typing import Generic, TypeVar, Optional
GenericNodeValue = TypeVar('GenericNodeValue')
@dataclasses.dataclass
class BaseNode(Generic[GenericNodeValue]):
value: GenericNodeValue
parent: Optional[BaseNode] = None
left: Optional[BaseNode] = None
right: Optional[BaseNode] = None
@property
def dummy(self) -> BaseNode:
return self
GenericNode = TypeVar('GenericNode', bound=BaseNode)
class BaseTree(Generic[GenericNode]):
def __init__(self):
self.root: Optional[GenericNode] = None
def get_dummy(self, node: GenericNode) -> GenericNode:
return node.dummy
@dataclasses.dataclass
class RedBlackTreeNode(BaseNode[int]):
red: bool = False
class RedBlackTree(BaseTree[RedBlackTreeNode]):
def get_dummy2(self, node: RedBlackTreeNode) -> RedBlackTreeNode:
return node.dummy
但是mypy
returns错误:
test.py:29: error: Incompatible return value type (got "BaseNode[Any]", expected "GenericNode")
test.py:39: error: Incompatible return value type (got "BaseNode[Any]", expected "RedBlackTreeNode")
有什么方法可以使用 python 键入来实现我的逻辑?
诀窍是向 self
参数添加注释。例如:
T = TypeVar('T')
V = TypeVar('V', bound='BaseNode')
@dataclasses.dataclass
class BaseNode(Generic[T]):
value: T
parent: Optional[BaseNode[T]] = None
left: Optional[BaseNode[T]] = None
right: Optional[BaseNode[T]] = None
@property
def dummy(self: V) -> V:
return self
@property
def dummy_parent(self: V) -> V:
assert isinstance(self.parent, type(self))
return self.parent
顺便说一下,您应该将类型参数添加到可选属性,这样它们就不会变成 BaseNode[Any]
,失去泛型的好处!
尝试实现尊重 mypy
的节点和树继承层次结构,我有下一个 类:
from __future__ import annotations
import dataclasses
from typing import Generic, TypeVar, Optional
GenericNodeValue = TypeVar('GenericNodeValue')
@dataclasses.dataclass
class BaseNode(Generic[GenericNodeValue]):
value: GenericNodeValue
parent: Optional[BaseNode] = None
left: Optional[BaseNode] = None
right: Optional[BaseNode] = None
@property
def dummy(self) -> BaseNode:
return self
GenericNode = TypeVar('GenericNode', bound=BaseNode)
class BaseTree(Generic[GenericNode]):
def __init__(self):
self.root: Optional[GenericNode] = None
def get_dummy(self, node: GenericNode) -> GenericNode:
return node.dummy
@dataclasses.dataclass
class RedBlackTreeNode(BaseNode[int]):
red: bool = False
class RedBlackTree(BaseTree[RedBlackTreeNode]):
def get_dummy2(self, node: RedBlackTreeNode) -> RedBlackTreeNode:
return node.dummy
但是mypy
returns错误:
test.py:29: error: Incompatible return value type (got "BaseNode[Any]", expected "GenericNode")
test.py:39: error: Incompatible return value type (got "BaseNode[Any]", expected "RedBlackTreeNode")
有什么方法可以使用 python 键入来实现我的逻辑?
诀窍是向 self
参数添加注释。例如:
T = TypeVar('T')
V = TypeVar('V', bound='BaseNode')
@dataclasses.dataclass
class BaseNode(Generic[T]):
value: T
parent: Optional[BaseNode[T]] = None
left: Optional[BaseNode[T]] = None
right: Optional[BaseNode[T]] = None
@property
def dummy(self: V) -> V:
return self
@property
def dummy_parent(self: V) -> V:
assert isinstance(self.parent, type(self))
return self.parent
顺便说一下,您应该将类型参数添加到可选属性,这样它们就不会变成 BaseNode[Any]
,失去泛型的好处!