python / python/mypy

Abstract class properties that are classes incorrectly reported in assignments

Open
#8,993 4 comments 5 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

feature topic-descriptors
Dominant language
Python
Stars
20.6k
Forks
3.3k
PR merge metrics
PR metrics pending

Description

  • Are you reporting a bug, or opening a feature request?
    I believe this is a bug.

  • Please insert below the code you are checking with mypy

from abc import ABC, abstractmethod
from typing import Type


class ISolution(ABC):
    @abstractmethod
    def __init__(self, b: int):
        pass

    @abstractmethod
    def func1(self, a: int) -> int:
        pass


class MySolution(ISolution):
    def __init__(self, b: int):
        self._b = b

    def func1(self, a: int) -> int:
        return a + self._b


class IHolder(ABC):
    @property
    @classmethod
    @abstractmethod
    def SolutionClass(cls) -> Type[ISolution]:
        pass

    # SolutionClass: Type[ISolution]

    @abstractmethod
    def __init__(self, c: int):
        pass

    @abstractmethod
    def cval(self) -> int:
        pass


class Main(IHolder):
    SolutionClass = MySolution

    def __init__(self, c: int):
        self._c = c

    def cval(self) -> int:
        return self._c


def check(holderclass: Type[IHolder], a: int, b: int, c: int) -> bool:
    holder = holderclass(c)
    solclass: Type[ISolution] = holderclass.SolutionClass
    return solclass(b).func1(a) == holder.cval()


print("should be true ", check(Main, 5, 5, 10))
print("should be false ", check(Main, 3, 4, 10))
  • What is the actual behavior/output?
classprop.py:53: error: Incompatible types in assignment (expression has type "Callable[[], Type[ISolution]]", variable has type "Type[ISolution]")

This is referring to the line:

    solclass: Type[ISolution] = holderclass.SolutionClass
  • What is the behavior/output you expect?
    No error to be reported.

Note. If you comment out

    @property
    @classmethod
    @abstractmethod
    def SolutionClass(cls) -> Type[ISolution]:
        pass

and then uncomment

    SolutionClass: Type[ISolution]

then mypy says the code is fine.

  • What are the versions of mypy and Python you are using?
    mypy 0.770
    python 3.7.6

  • Do you see the same issue after installing mypy from Git master?
    I'm trying to avoid dealing with that!

  • What are the mypy flags you are using? (For example --strict-optional)
    None

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the diagnostic with the provided abstract class, property, and classmethod example. Compare type inference for holderclass.SolutionClass with the annotated class-attribute version, then verify that the assignment to solclass no longer reports an incompatible type.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
compilers, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.