Skip to content

Instantiating concrete classes fails check in some cases #6586

Closed
@majutsushi

Description

@majutsushi

#1843/#2853 added support for instantiating variables with an abstract type, under the assumption that it will always be applied to a concrete subclass. However, this doesn't seem to work in all cases:

Given

class Base(ABC):
    @abstractmethod
    def m(self) -> None:
        pass

class A(Base):
    def m(self) -> None:
        pass

class B(Base):
    def m(self) -> None:
        pass

Then

var: Type[Base]
if "foo" == "bar":
    var = A
elif "foo" == "baz":
    var = B
else:
    raise RuntimeError()

var()  # error: Cannot instantiate abstract class 'Base' with abstract attribute 'm'

As far as I understand it the last line shouldn't result in an error.

If I remove class B (and the corresponding elif) I don't get an error. Interestingly, if I remove the whole if block I also don't get an error.

This is with version 0.670.

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