graphql-python / graphql-python/graphene
Why SubclassWithMeta.__init_subclass__ terminates the super() chain?
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 8.2k
- Forks
- 818
- PR merge metrics
- No merged PRs in 30d
Description
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](https://github.com/graphql-python/graphene/pull/1234) would simply add `super().__init_subclass__()` to the last line of `SubclassWithMeta.__init_subclass__`.
Contributor guide
No contributing guide indexed for this repository
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 with graphene/utils/subclass_with_meta.py at lines 21-46 and reproduce the Foo, Bar1, and Bar2 example from the issue. Review the proposed fix in graphene/pull/1234 and verify that SubclassWithMeta.__init_subclass__ no longer stops the cooperative super() chain. Done means Foo.__init_subclass__ runs for both inheritance orders without breaking existing behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 25/100