Returns a config class.
(fn: F)
| 1056 | # Cache (attr.make_class()/inspect.signature() is expensive), func often shared across configs. |
| 1057 | @lru_cache(maxsize=1024) |
| 1058 | def _config_class_for_function(fn: F) -> type[FunctionConfigBase]: |
| 1059 | """Returns a config class.""" |
| 1060 | init_sig = inspect.signature(fn) |
| 1061 | # attrs strips leading underscores, resulting in '_' becoming ''. We could get around this via |
| 1062 | # using an alias, but the safer option is to require explicit names for params. See: |
| 1063 | # https://github.com/python-attrs/attrs/issues/391 |
| 1064 | # https://github.com/python-attrs/attrs/issues/945 |
| 1065 | for param in ["fn", "_"]: |
| 1066 | if param in init_sig.parameters: |
| 1067 | raise ValueError(f"Configured function {fn} should not have a '{param}' parameter.") |
| 1068 | config_attrs = { |
| 1069 | name: _attr_field_from_signature_param(param) for name, param in init_sig.parameters.items() |
| 1070 | } |
| 1071 | return _wrap_config_attr_cls( |
| 1072 | attr.make_class( |
| 1073 | "FunctionConfig", |
| 1074 | bases=(FunctionConfigBase[F],), |
| 1075 | attrs=config_attrs, |
| 1076 | **_config_class_kwargs(), |
| 1077 | ), |
| 1078 | name=f"config_for_function({fn.__module__}.{fn.__qualname__})", |
| 1079 | ) |
| 1080 | |
| 1081 | |
| 1082 | def config_for_function(fn: Callable[..., T]) -> Union[Any, FunctionConfigBase[T]]: |
no test coverage detected