Skip to content

Instantly share code, notes, and snippets.

@jmehnle
Last active October 8, 2020 21:27
Show Gist options
  • Save jmehnle/37ece52f9dbbec439ed8d0c11db47f41 to your computer and use it in GitHub Desktop.
Save jmehnle/37ece52f9dbbec439ed8d0c11db47f41 to your computer and use it in GitHub Desktop.
Python typing: mypy fails to match generic protocol class
(py3.7-typing-protocol) jbook:~/scratch> mypy --version
mypy 0.790+dev.7273e9ab1664b59a74d9bd1d2361bbeb9864b7ab
(py3.7-typing-protocol) jbook:~/scratch> mypy .
main.py:11: error: Type argument "pymysql.connections.Connection" of "DatabaseAdapter" must be a subtype of "pep249.Connection"
Found 1 error in 1 file (checked 2 source files)
(py3.7-typing-protocol) jbook:~/scratch> python
Python 3.7.9 (default, Sep  6 2020, 13:20:25)
[Clang 11.0.3 (clang-1103.0.32.62)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pep249
>>> import pymysql
>>> pymysql.connections.Connection
<class 'pymysql.connections.Connection'>
>>> issubclass(pymysql.connections.Connection, pep249.Connection)
True
# main.py
from typing import Generic, TypeVar
import pep249
import pymysql
ConnectionT = TypeVar("ConnectionT", bound=pep249.Connection)
class DatabaseAdapter(Generic[ConnectionT]): ...
class MySQLAdapter(DatabaseAdapter[pymysql.connections.Connection]): ...
# pep249.py
from typing import Any
from typing_extensions import Protocol, runtime_checkable
@runtime_checkable
class Connection(Protocol):
def close(self) -> None: ...
def commit(self) -> None: ...
def rollback(self) -> None: ...
def cursor(self, *__args: Any, **__kwargs: Any) -> Any: ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment