Typing on child class' methods of a Generic base class

Nicolas Haller python at boiteameuh.org
Sat Mar 12 12:05:43 EST 2022


On 2022-03-10 12:31, Dieter Maurer wrote:
> Nicolas Haller wrote at 2022-3-9 10:53 -0500:
>> ...
>> The documentation about "user-defined generic types"[1] says that I can
>> fix some types on a child class (class MyDict(Mapping[str, T]):) but
>> doesn't say much about the signature of the methods I need to
>> implement/override on that child class.
> 
> I have the fealing that this is a case of (generic type) "specialization".
> In this setup, `Mapping` would be a generic type with two type
> variables `K` (the key type) and `V` (the value type).
> The signatures of its methods would use those type variables.
> In your example, you specialize the key type to `str` (and
> leave the value type generic). The signatures of the methods
> would automatically follow this specialization -- without the need
> to do anything.

If I understand correctly, you're saying I should use the first 
alternative by keeping the signature as it is in the base class:
---
T = TypeVar("T")


class Base(Generic[T], metaclass=ABCMeta):
     """A base class."""

     @abstractmethod
     def _private_method(self, an_arg: T) -> T:
         ...

     def public_method(self, an_arg: T) -> T:
         from_private_method = self._private_method(an_arg)
         return from_private_method

class Alternative1(Base[int]):
     def _private_method(self, an_arg: T) -> T:  # I keep T
         return 42
---

The problem with it is that mypy doesn´t seem quite happy with it:
./scratch.py:22: error: Incompatible return value type (got "int", 
expected "T")

Do you think this is error is incorrect? If so, I can open an issue with 
mypy.

Thanks,

-- 
Nicolas


More information about the Python-list mailing list