簡體   English   中英

更改子類的 python 類型提示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM