mypy不明白类和接口是一样的

问题描述 投票:0回答:1
from abc import ABC, abstractmethod


class IState(ABC):
    """Interface para o padrão de projeto State."""

    @abstractmethod
    def sucesso_ao_pagar(self) -> None:
        pass

    @abstractmethod
    def despachar_pedido(self) -> None:
        pass

    @abstractmethod
    def cancelar_pedido(self) -> None:
        pass


class Pedido:
    """Classe que representa um pedido."""

    def __init__(self) -> None:
        self.estado_atual = AguardandoPagamentoState(self)

    def realizar_pagamento(self) -> None:
        self.estado_atual.sucesso_ao_pagar()

    def despachar(self) -> None:
        self.estado_atual.despachar_pedido()

    def cancelar(self) -> None:
        self.estado_atual.cancelar_pedido()

    def set_estado_atual(self, estado_atual: IState) -> None:
        self.estado_atual = estado_atual

    def __str__(self) -> str:
        return str(self.estado_atual)


class AguardandoPagamentoState(IState):
    """Estado inicial do pedido."""

    def __init__(self, meu_pedido: Pedido):
        self.pedido = meu_pedido

    def sucesso_ao_pagar(self) -> None:
        print("Pedido pago com sucesso!")
        self.pedido.set_estado_atual(PagoState(self.pedido))

    def despachar_pedido(self) -> None:
        print("Pedido não pode ser despachado, pois não foi pago!")

    def cancelar_pedido(self) -> None:
        print("Pedido cancelado com sucesso!")
        self.pedido.set_estado_atual(CanceladoState(self.pedido))

这段代码工作正常,但是当我运行 mypy 时,它指出:

Incompatible types in assignment (expression has type "IState", variable has type "AguardandoPagamentoState")  [assignment]mypy

既然 AguardandoPagamentoState 类实现了 IState 接口,为什么会产生这个问题?

如果我发表这样的评论

# type: ignore

它停止抛出这个错误,但我想知道如何解决这个问题。 Mypy 应该理解类关系

python interface mypy
1个回答
0
投票

问题是你为

AguardandoPagamentoState
中的属性建立了
Pedido.__init__
的静态类型:

def __init__(self) -> None:
    self.estado_atual = AguardandoPagamentoState(self)

但是然后您尝试通过允许在IState中分配

set_estado_atual
类型的
any
值来放松它:

def set_estado_atual(self, estado_atual: IState) -> None:
    self.estado_atual = estado_atual

AguardandoPagamentoState
可以实现接口,但并不是所有实现接口的类型都是
AguardandoPagamentoState
或其子类。您需要明确建立更通用的静态类型:

def __init__(self) -> None:
    self.estado_atual: IState = AguardandoPagamentoState(self)
© www.soinside.com 2019 - 2024. All rights reserved.