55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
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,
|
|
"dict": dict,
|
|
"datetime": datetime,
|
|
"file": UploadFile,
|
|
|
|
# TODO(Faraphel): use a "ParameterRegistry" or other functions to handle complex type ?
|
|
"list[dict]": list[dict],
|
|
# "tuple": tuple,
|
|
# "set": set,
|
|
}
|
|
|
|
|
|
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
|