[英]Changing python type hints for subclasses
想象一下使用基本 class 和 DAG 子類來處理圖形的以下代碼:
class NodeBase:
def some_node_func(self):
pass
class GraphBase:
def add(self, node: NodeBase):
node.some_node_func()
class DirectedNode(NodeBase):
def some_dag_func(self):
pass
class DirectedGraph(GraphBase):
def add(self, node: DirectedNode):
node.some_node_func()
node.some_dag_func()
當我嘗試將此代碼與mypy
一起使用時,出現如下錯誤:
error: Argument 1 of "add" is incompatible with supertype "GraphBase";
supertype defines the argument type as "NodeBase" [override]
我的問題表面上類似於Python:如何處理子類中的類型提示? 但我實際上需要與依賴於相應DirectedNode
功能的DirectedGraph.add
function 不同的行為。
我意識到這“違反了 Liskov 替換原則”,但我不需要能夠將DirectedNode
實例添加到非 DAG 圖中。
我怎樣才能構造這樣的東西,以便 mypy 不會抱怨? 如果可能的話,我想避免僅僅禁用檢查。
根據用於表示節點的類型參數化GraphBase
,而不是對NodeBase
的硬編碼引用
from typing import Generic, TypeVar
N = TypeVar('N', bound=NodeBase)
class NodeBase:
def some_node_func(self):
pass
class GraphBase(Generic[N]):
def add(self, node: N):
node.some_node_func()
class DirectedNode(NodeBase):
def some_dag_func(self):
pass
class DirectedGraph(GraphBase[DirectedNode]):
def add(self, node: DirectedNode):
node.some_node_func()
node.some_dag_func()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.