| 698 | |
| 699 | @functools.wraps(init) |
| 700 | def inner_init(self, *args, **kwargs): |
| 701 | # Ignore private kwargs in the init. |
| 702 | init_kwargs = {k: v for k, v in kwargs.items() if not k.startswith("_")} |
| 703 | config_init_kwargs = {k: v for k, v in kwargs.items() if k.startswith("_")} |
| 704 | if not isinstance(self, ConfigMixin): |
| 705 | raise RuntimeError( |
| 706 | f"`@register_for_config` was applied to {self.__class__.__name__} init method, but this class does " |
| 707 | "not inherit from `ConfigMixin`." |
| 708 | ) |
| 709 | |
| 710 | ignore = getattr(self, "ignore_for_config", []) |
| 711 | # Get positional arguments aligned with kwargs |
| 712 | new_kwargs = {} |
| 713 | signature = inspect.signature(init) |
| 714 | parameters = { |
| 715 | name: p.default for i, (name, p) in enumerate(signature.parameters.items()) if i > 0 and name not in ignore |
| 716 | } |
| 717 | for arg, name in zip(args, parameters.keys()): |
| 718 | new_kwargs[name] = arg |
| 719 | |
| 720 | # Then add all kwargs |
| 721 | new_kwargs.update( |
| 722 | { |
| 723 | k: init_kwargs.get(k, default) |
| 724 | for k, default in parameters.items() |
| 725 | if k not in ignore and k not in new_kwargs |
| 726 | } |
| 727 | ) |
| 728 | |
| 729 | # Take note of the parameters that were not present in the loaded config |
| 730 | if len(set(new_kwargs.keys()) - set(init_kwargs)) > 0: |
| 731 | new_kwargs["_use_default_values"] = list(set(new_kwargs.keys()) - set(init_kwargs)) |
| 732 | |
| 733 | new_kwargs = {**config_init_kwargs, **new_kwargs} |
| 734 | getattr(self, "register_to_config")(**new_kwargs) |
| 735 | init(self, *args, **init_kwargs) |
| 736 | |
| 737 | return inner_init |
| 738 | |