mypy icon indicating copy to clipboard operation
mypy copied to clipboard

Presence of property in Protocol causes false positive in multiple inheritance scenario

Open slanzmich opened this issue 1 year ago • 1 comments

Bug Report

I'm getting a false positive from the following example

from typing import Protocol
from typing_extensions import Self

class P(Protocol):
    # Removing the property makes the problem disappear
    @property
    def x(self) -> int: ...

    def clone(self) -> Self: ...

class A:
    def clone(self) -> Self:
        return self

class B(A, P):
    @property
    def x(self) -> int:
        return 100
main.py:18: error: Definition of "clone" in base class "A" is incompatible with definition in base class "P"  [misc]

Obviously, A.clone does not actually clone the instance, but that is left out for clarity.

The false positive is not reported when I remove the property x from the protocol P.

To Reproduce

https://mypy-play.net/?mypy=latest&python=3.12&gist=fe15d8bc18aa7b61feb3e56fce615f47

slanzmich avatar Feb 05 '24 08:02 slanzmich

Thanks, looks like it's not just property, basically anything else in the Protocol seems to trigger the error:

from typing import Protocol, Self

class P(Protocol):
    def foo(self) -> None: ...
    def clone(self) -> Self: ...

class A:
    def clone(self) -> Self: ...

class B(A, P):
    pass

(As a workaround you can consider not explicitly inheriting from the protocol)

hauntsaninja avatar Feb 05 '24 08:02 hauntsaninja