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
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to