Skip to content

Example in PEP 544 seems to be wrong #1231

Closed

Description

@MaxG87

I am on Python 3.8 and use MyPy 0.740

I consider the following example from PEP 544:

from typing import Any, Protocol

class ProtoA(Protocol):
    def meth(self, x: int) -> int: ...
class ProtoB(Protocol):
    def meth(self, obj: Any, x: int) -> int: ...

class C:
    def meth(self, x: int) -> int: ...

a: ProtoA = C  # Type check error, signatures don't match!
b: ProtoB = C  # OK

In the final two lines a class is assigned to a instance. MyPy thus reports

/tmp/protocol-test.py:19: error: Incompatible types in assignment (expression has type "Type[C]", variable has type "ProtoA")
/tmp/protocol-test.py:20: error: Incompatible types in assignment (expression has type "Type[C]", variable has type "ProtoB")
Found 2 errors in 1 file (checked 1 source file)

If I fix that (i.e. adding the missing '()'), than it seems as if the assignment to b should cause a type error, not the assignment to a. Mypy`s report is consistent to my presumption.

I hope it is ok to ask this, since I am here anyways: What is the difference between ... and pass? RTFM with link would be fine.

Activity

  1. ilevkivskyi commented on Nov 11, 2019

    @ilevkivskyi
    Member

    This is just a mypy bug (or rather a missing feature), it doesn't support class objects and modules as implementations of protocols, see python/mypy#4536

  2. MaxG87 commented on Nov 11, 2019

    @MaxG87
    Author

    I am sorry to insist, but it still holds that the signatures for ProtoA and C match while these for ProtoB and C are in conflict. Thus, at least the comments must be swapped.

  3. ilevkivskyi commented on Nov 11, 2019

    @ilevkivskyi
    Member

    You can just try examples in REPL:

    a: ProtoA = C  # You say this should be accepted
    a.meth(42)  # Oops TypeError here

    You can also read some tutorials about how bound and unbound methods work in Python.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions