typeshed icon indicating copy to clipboard operation
typeshed copied to clipboard

Subclasses of `mailbox.Mailbox` not recognized as such

Open jwodder opened this issue 1 month ago • 2 comments

Consider the following code:

from abc import ABC, abstractmethod
import mailbox


class MailboxFactory(ABC):
    @abstractmethod
    def open(self) -> mailbox.Mailbox: ...


class MboxFactory(MailboxFactory):
    def __init__(self, path: str) -> None:
        self.path = path

    def open(self) -> mailbox.mbox:
        return mailbox.mbox(self.path)

I'm 90% sure this should be acceptable, but running 1.18.2 on this code produces the error:

mailbox02.py:14: error: Return type "mbox" of "open" incompatible with return type "Mailbox[Message[str, str]]" in supertype "MailboxFactory"  [override]
Found 1 error in 1 file (checked 1 source file)

Similar errors happen for other Mailbox subclasses as well.

jwodder avatar Oct 28 '25 19:10 jwodder

The problem is that Mailbox is generic over the message type (_MessageT), which is invariant and defaults to Message[str, str]. Easy workaround is to use mailbox.Mailbox[Any], although we should probably change the default for Mailbox in typeshed for cases like this.

srittau avatar Oct 30 '25 18:10 srittau

In fact, we can make the type variable covariant in typeshed, which should fix this problem.

srittau avatar Oct 30 '25 19:10 srittau