graphene icon indicating copy to clipboard operation
graphene copied to clipboard

Why SubclassWithMeta.__init_subclass__ terminates the super() chain?

Open ruohola opened this issue 5 years ago • 0 comments

Is there a great reason why graphene.utils.subclass_with_meta.SubclassWithMeta.__init_subclass__, doesn't call super().__init_subclass__()? https://github.com/graphql-python/graphene/blob/master/graphene/utils/subclass_with_meta.py#L21-#L46

The issue with this is IMO the following:

  • Class Foo has defined a custom __init_subclass__.
  • Class Bar derives from Foo and e.g. graphene.types.ObjectType.

Now if Foo is accidentally placed after ObjectType in Bar's inheritance list, Foo.__init_subclass__ will never be run.

Here's a quick demo:

from graphene.types import ObjectType

class Foo:
    def __init_subclass__(cls):
        print(f"Init Foo's subclass: {cls.__name__}")
        super().__init_subclass__()

class Bar1(Foo, ObjectType):
    pass

class Bar2(ObjectType, Foo):
    pass

Output:

Init Foo's subclass: Bar1

My proposed fix PR would simply add super().__init_subclass__() to the last line of SubclassWithMeta.__init_subclass__.

ruohola avatar Jul 21 '20 19:07 ruohola