flakes
flakes

Reputation: 23584

Class Decorator Compatible for Mypy

Say I have the following simple example without any typehints:

def wrapper(cls):
    class Subclass(cls):
        def subclass_method(self):
            pass
    return Subclass


@wrapper
class Parent:
    def parent_method(self):
        pass


p = Parent()
p.parent_method()
p.subclass_method()

How can I restructure this code using typehints, such that when I run mypy against an instance of Parent, it will recognize both subclass_method and parent_method?

Possible solutions:

Upvotes: 0

Views: 516

Answers (1)

chepner
chepner

Reputation: 530853

This would be much simpler without the wrapper at all.

class SomeMixin:
    def subclass_method(self):
        pass


class Parent(SomeMixin):
    def parent_method(self):
        pass


p = Parent()
p.parent_method()
p.subclass_method()

Here, you define SomeMixin once, not once per call to a wrapper, and the class SomeMixin is known statically. All the various classes with the name Subclass are created dynamically, and mypy can't know statically which class the name Parent is actually bound to.

Upvotes: 2

Related Questions