# Buggy code
def validator(init):
    init_qualname = dict(inspect.getmembers(init))["__qualname__"]
    init_clsnme = init_qualname.split(".")[0]
    init_params = inspect.signature(init).parameters
    init_fields = {
        param.name: (
            param.annotation if param.annotation != inspect.Parameter.empty else Any,
            param.default if param.default != inspect.Parameter.empty else ...,
        )
        for param in init_params.values()
        if param.name != "self"
        and param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD
    }

    if base_model is None:
        PydanticModel = create_model(
            model_name=f"{init_clsnme}Model",
            __config__=BaseValidatedInitializerModel.Config,
            **init_fields,
        )
    else:
        PydanticModel = create_model(
            model_name=f"{init_clsnme}Model",
            __base__=base_model,
            **init_fields,
        )

    def validated_repr(self) -> str:
        return dump_code(self)

    def validated_getnewargs_ex(self):
        return (), self.__init_args__

    @functools.wraps(init)
    def init_wrapper(*args, **kwargs):
        self, *args = args

        nmargs = {
            name: arg
            for (name, param), arg in zip(list(init_params.items()), [self] + args)
            if name != "self"
        }
        model = PydanticModel(**{**nmargs, **kwargs})

        # merge nmargs, kwargs, and the model fields into a single dict
        all_args = {**nmargs, **kwargs, **model.__dict__}

        # save the merged dictionary for Representable use, but only of the
        # __init_args__ is not already set in order to avoid overriding a
        # value set by a subclass initializer in super().__init__ calls
        if not getattr(self, "__init_args__", {}):
            self.__init_args__ = OrderedDict(
                {
                    name: arg
                    for name, arg in sorted(all_args.items())
                    if type(arg) != mx.gluon.ParameterDict
                }
            )
            self.__class__.__getnewargs_ex__ = validated_getnewargs_ex
            self.__class__.__repr__ = validated_repr

        return init(self, **all_args)

    # attach the Pydantic model as the attribute of the initializer wrapper
    setattr(init_wrapper, "Model", PydanticModel)

    return init_wrapper


# Traceback (TypeError)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-f1a9ed5569ee> in <module>
----> 1 from gluonts.dataset.repository.datasets import get_dataset, dataset_recipes
2 from gluonts.dataset.util import to_pandas

/usr/local/lib/python3.7/site-packages/gluonts/dataset/repository/datasets.py in <module>
17 from pathlib import Path
18
---> 19 from gluonts.dataset.artificial import ConstantDataset
20 from gluonts.dataset.common import TrainDatasets, load_datasets
21 from gluonts.dataset.repository._artificial import generate_artificial_dataset

/usr/local/lib/python3.7/site-packages/gluonts/dataset/artificial/__init__.py in <module>
13
14 # Relative imports
---> 15 from ._base import (
16     ArtificialDataset,
17     ConstantDataset,

/usr/local/lib/python3.7/site-packages/gluonts/dataset/artificial/_base.py in <module>
22
23 # First-party imports
---> 24 from gluonts.dataset.artificial.recipe import (
25     BinaryHolidays,
26     BinaryMarkovChain,

/usr/local/lib/python3.7/site-packages/gluonts/dataset/artificial/recipe.py in <module>
34 # First-party imports
35 from gluonts.core.component import validated
---> 36 from gluonts.dataset.common import DataEntry
37
38 ValueOrCallable = Union[Any, Callable]

/usr/local/lib/python3.7/site-packages/gluonts/dataset/common.py in <module>
40 from gluonts.core.exception import GluonTSDataError
41 from gluonts.dataset import jsonl, util
---> 42 from gluonts.dataset.stat import (
43     DatasetStatistics,
44     calculate_dataset_statistics,

/usr/local/lib/python3.7/site-packages/gluonts/dataset/stat.py in <module>
27
28
---> 29 class ScaleHistogram:
30     """
31     Scale histogram of a timeseries dataset

/usr/local/lib/python3.7/site-packages/gluonts/dataset/stat.py in ScaleHistogram()
49         bin_counts: Optional[dict] = None,
50         empty_target_count: int = 0,
---> 51     ) -> None:
52         self._base = base
53         self.bin_counts = defaultdict(

/usr/local/lib/python3.7/site-packages/gluonts/core/component.py in validator(init)
396                 model_name=f"{init_clsnme}Model",
397                 __config__=BaseValidatedInitializerModel.Config,
--> 398                 **init_fields,
399             )
400         else:

/usr/local/lib/python3.7/site-packages/pydantic/main.cpython-37m-darwin.so in pydantic.main.create_model()

TypeError: create_model() takes exactly 1 positional argument (0 given)

# Fixed code
def validator(init):
    init_qualname = dict(inspect.getmembers(init))["__qualname__"]
    init_clsnme = init_qualname.split(".")[0]
    init_params = inspect.signature(init).parameters
    init_fields = {
        param.name: (
            param.annotation if param.annotation != inspect.Parameter.empty else Any,
            param.default if param.default != inspect.Parameter.empty else ...,
        )
        for param in init_params.values()
        if param.name != "self"
        and param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD
    }

    if base_model is None:
        PydanticModel = create_model(
            f"{init_clsnme}Model",
            __config__=BaseValidatedInitializerModel.Config,
            **init_fields,
        )
    else:
        PydanticModel = create_model(
            f"{init_clsnme}Model",
            __base__=base_model,
            **init_fields,
        )

    def validated_repr(self) -> str:
        return dump_code(self)

    def validated_getnewargs_ex(self):
        return (), self.__init_args__

    @functools.wraps(init)
    def init_wrapper(*args, **kwargs):
        self, *args = args

        nmargs = {
            name: arg
            for (name, param), arg in zip(list(init_params.items()), [self] + args)
            if name != "self"
        }
        model = PydanticModel(**{**nmargs, **kwargs})

        # merge nmargs, kwargs, and the model fields into a single dict
        all_args = {**nmargs, **kwargs, **model.__dict__}

        # save the merged dictionary for Representable use, but only of the
        # __init_args__ is not already set in order to avoid overriding a
        # value set by a subclass initializer in super().__init__ calls
        if not getattr(self, "__init_args__", {}):
            self.__init_args__ = OrderedDict(
                {
                    name: arg
                    for name, arg in sorted(all_args.items())
                    if type(arg) != mx.gluon.ParameterDict
                }
            )
            self.__class__.__getnewargs_ex__ = validated_getnewargs_ex
            self.__class__.__repr__ = validated_repr

        return init(self, **all_args)

    # attach the Pydantic model as the attribute of the initializer wrapper
    setattr(init_wrapper, "Model", PydanticModel)

    return init_wrapper