def _synthesise_init()

in chz/data_model.py [0:0]


def _synthesise_init(fields: Collection[Field], user_globals: dict[str, Any]) -> Callable[..., Any]:
    varlocals = {"__chz_MISSING": MISSING, "__chz_builtins": builtins}

    # __chz_args is not strictly necessary, but makes for better errors
    args = ["self", "*__chz_args"]
    body = [
        "if __chz_args:",
        "    raise __chz_builtins.TypeError(f'{self.__class__.__name__}.__init__ only takes keyword arguments')",
        "if '__chz_fields__' not in __chz_builtins.type(self).__dict__:",
        "    raise __chz_builtins.TypeError(f'{self.__class__.__name__} is not decorated with @chz.chz')",
    ]
    for field in fields:
        if field.logical_name.startswith("__chz") or field.logical_name == "self":
            raise ValueError(f"Field name {field.logical_name!r} is reserved")
        _arg, _body = _synthesise_field_init(field, varlocals)

        args.append(_arg)
        body.append(_body)

    # Note it's important we validate before we check all init_property
    body.append("self.__chz_validate__()")
    body.append("self.__chz_init_property__()")

    return _create_fn("__init__", args, body, locals=varlocals, globals=user_globals)