Consider the following (simplified) typeshed definition for email.feedparser.FeedParser:
class FeedParser:
def __init__(self, _factory: Callable[[], Message] = ...) -> None: ...
def close(self) -> Message: ...
FeedParser allows a message factory to be passed in and will use it to construct the return value to close(). Unfortunately you have to cast the return value of close() to the correct type:
parser = FeedParser(MyMessage)
message = cast(MyMessage, parser.close())
The following type definition fixes this problem:
M = TypeVar("M", bound=Message)
class FeedParser(Generic[M]):
def __init__(self, _factory: Callable[[], M] = ...) -> None: ...
def close(self) -> M: ...
Now the example above does not require the cast to make mypy happy. But unfortunately using the default factory will not work anymore:
parser = FeedParser()
message = parser.close()
This will cause mypy to complain error: Need type annotation for variable. Is there any solution for this conundrum?
Consider the following (simplified) typeshed definition for
email.feedparser.FeedParser:FeedParser allows a message factory to be passed in and will use it to construct the return value to
close(). Unfortunately you have to cast the return value ofclose()to the correct type:The following type definition fixes this problem:
Now the example above does not require the cast to make mypy happy. But unfortunately using the default factory will not work anymore:
This will cause mypy to complain
error: Need type annotation for variable. Is there any solution for this conundrum?