import inspect import typing import fastapi def load(parameters_definition: dict[str, dict]) -> list[inspect.Parameter]: """ Load a list python function parameters from their definitions. :param parameters_definition: the definitions of the parameters :return: the python function parameters Examples: >>> parameters_definition = { ... "boolean": {"type": "bool", "default": False}, ... "list": {"type": "list", "default": [1, 2, 3]}, ... "file": {"type": "file"}, ... } >>> parameters = load_parameters(parameters_definition) """ parameters: list[inspect.Parameter] = [] for name, definition in parameters_definition.items(): # preprocess the type match definition["type"]: case "file": # shortcut for uploading a file definition["type"] = typing.Annotated[ fastapi.UploadFile, fastapi.File() ] # deserialize the parameter parameter = inspect.Parameter( name, inspect.Parameter.POSITIONAL_OR_KEYWORD, default=definition.get("default", inspect.Parameter.empty), annotation=definition["type"], ) parameters.append(parameter) # sort the parameters so that non-default arguments always end up before default ones parameters.sort(key=lambda parameter: parameter.default is inspect.Parameter.empty, reverse=True) return parameters