diff --git a/graphene/types/inputobjecttype.py b/graphene/types/inputobjecttype.py index 257f48be..8171ca46 100644 --- a/graphene/types/inputobjecttype.py +++ b/graphene/types/inputobjecttype.py @@ -7,12 +7,12 @@ # For static type checking with type checker if TYPE_CHECKING: - from typing import Dict, Callable # NOQA + from typing import Dict, Callable, Type # NOQA class InputObjectTypeOptions(BaseOptions): fields = None # type: Dict[str, InputField] - container = None # type: InputObjectTypeContainer + container = None # type: Type[InputObjectTypeContainer] # Currently in Graphene, we get a `None` whenever we access an (optional) field that was not set in an InputObjectType @@ -103,8 +103,8 @@ def __init_subclass_with_meta__(cls, container=None, _meta=None, **options): else: _meta.fields = fields if container is None: - container = type(cls.__name__, (InputObjectTypeContainer, cls), {}) - _meta.container = container + container = InputObjectTypeContainer + _meta.container = type(cls.__name__, (container, cls), {}) # type: ignore super(InputObjectType, cls).__init_subclass_with_meta__(_meta=_meta, **options) @classmethod diff --git a/graphene/types/tests/test_inputobjecttype.py b/graphene/types/tests/test_inputobjecttype.py index 0d7bcf80..664ecd12 100644 --- a/graphene/types/tests/test_inputobjecttype.py +++ b/graphene/types/tests/test_inputobjecttype.py @@ -1,9 +1,10 @@ from graphql import Undefined +import pytest from ..argument import Argument from ..field import Field from ..inputfield import InputField -from ..inputobjecttype import InputObjectType +from ..inputobjecttype import InputObjectType, InputObjectTypeContainer from ..objecttype import ObjectType from ..scalars import Boolean, String from ..schema import Schema @@ -167,3 +168,16 @@ def resolve_undefined_optionals_work(self, info, input: TestUndefinedInput): assert not result.errors assert result.data == {"undefinedOptionalsWork": True} + + +def test_inputobjecttype_explicit_container(): + class MyInputObjectType(InputObjectType): + class Meta: + container = InputObjectTypeContainer + + first_name = String() + last_name = String() + + container = MyInputObjectType._meta.container(first_name="John") + assert container.first_name == "John" + assert container.last_name is None