import inspect from datetime import datetime from fastapi import UploadFile # the list of types and their name that can be used by the API types: dict[str, type] = { "bool": bool, "int": int, "float": float, "str": str, "bytes": bytes, "list": list, "tuple": tuple, "set": set, "dict": dict, "datetime": datetime, "file": UploadFile, } 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]}, ... "datetime": {"type": "datetime"}, ... "file": {"type": "file"}, ... } >>> parameters = load_parameters(parameters_definition) """ parameters: list[inspect.Parameter] = [] for name, definition in parameters_definition.items(): # deserialize the parameter parameter = inspect.Parameter( name, inspect.Parameter.POSITIONAL_OR_KEYWORD, default=definition.get("default", inspect.Parameter.empty), annotation=types[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