typeshed
typeshed copied to clipboard
Subclasses of `mailbox.Mailbox` not recognized as such
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.
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.
In fact, we can make the type variable covariant in typeshed, which should fix this problem.