Skip to content

Weird error messages when mixing classes with instances #3050

Closed

Description

@miedzinski
class A: pass
x: Tuple[A]
x = A,  # E: Incompatible types in assignment (expression has type "Tuple[A]", variable has type "Tuple[A]")
y: Tuple[Type[A]]
y = A,  # OK, expected
def f(x: Tuple[A]) -> None: return None
f((A,))  # E: Argument 1 to "f" has incompatible type "Tuple[A]"; expected "Tuple[A]"
reveal_type((A,))  # E: Revealed type is 'Tuple[def () -> x.A]'
z: A
z = A  # E: Incompatible types in assignment (expression has type "A" (type object), variable has type "A")
z = A,  # E: Incompatible types in assignment (expression has type "Tuple[A]", variable has type "A")

Looks like mypy formats class type in three ways: T (which is wrong), T (type object), and def () -> T. In some cases these errors are unclear.

Activity

  1. ilevkivskyi commented on Mar 23, 2017

    @ilevkivskyi
    Member

    Yes, I remember I noticed this around a year ago, last two formats are OK I think, but the first one is definitely misleading.

  2. ambv commented on Apr 12, 2017

    @ambv
    Contributor

    So the correct error message should be:

    E: Incompatible types in assignment (expression has type "Tuple[Type[A]]", variable has type "Tuple[A]")

  3. elazarg commented on May 16, 2017

    @elazarg
    Contributor

    Example from #3372:

    class A: pass
    class B(A): pass
    def f(a: A): pass
    
    f(B)  # E: Argument 1 to "f" has incompatible type "B"; expected "A"
    a: A = B  # E: Incompatible types in assignment (expression has type "B", variable has type "A")
  4. elazarg commented on May 16, 2017

    @elazarg
    Contributor

    I will submit a PR is there is agreement on the correct error message is.

    I am +1 on Type[A] as @ambv suggested.

  5. elazarg commented on May 16, 2017

    @elazarg
    Contributor

    I think the issue becomes even more confusing when dealing with metaclasses.

  6. ilevkivskyi commented on May 16, 2017

    @ilevkivskyi
    Member

    I am also +1 on Type[A].

  7. gvanrossum commented on May 16, 2017

    @gvanrossum
    Member

    Yup

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions