ai-server/source/utils/parameters.py

46 lines
1.5 KiB
Python

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