Abstract class properties that are classes incorrectly reported in assignments
Nobody has claimed this yet.
- 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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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