ai-server/source/utils/parameters.py

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