61 lines
2.3 KiB
Python
61 lines
2.3 KiB
Python
import inspect
|
|
from datetime import datetime
|
|
import pprint
|
|
|
|
def function_to_json(func) -> dict:
|
|
# 定义 Python 类型到 JSON 数据类型的映射
|
|
type_map = {
|
|
str: "string", # 字符串类型映射为 JSON 的 "string"
|
|
int: "integer", # 整型类型映射为 JSON 的 "integer"
|
|
float: "number", # 浮点型映射为 JSON 的 "number"
|
|
bool: "boolean", # 布尔型映射为 JSON 的 "boolean"
|
|
list: "array", # 列表类型映射为 JSON 的 "array"
|
|
dict: "object", # 字典类型映射为 JSON 的 "object"
|
|
type(None): "null", # None 类型映射为 JSON 的 "null"
|
|
}
|
|
|
|
# 获取函数的签名信息
|
|
try:
|
|
signature = inspect.signature(func)
|
|
except ValueError as e:
|
|
# 如果获取签名失败,则抛出异常并显示具体的错误信息
|
|
raise ValueError(
|
|
f"无法获取函数 {func.__name__} 的签名: {str(e)}"
|
|
)
|
|
|
|
# 用于存储参数信息的字典
|
|
parameters = {}
|
|
for param in signature.parameters.values():
|
|
# 尝试获取参数的类型,如果无法找到对应的类型则默认设置为 "string"
|
|
try:
|
|
param_type = type_map.get(param.annotation, "string")
|
|
except KeyError as e:
|
|
# 如果参数类型不在 type_map 中,抛出异常并显示具体错误信息
|
|
raise KeyError(
|
|
f"未知的类型注解 {param.annotation},参数名为 {param.name}: {str(e)}"
|
|
)
|
|
# 将参数名及其类型信息添加到参数字典中
|
|
parameters[param.name] = {"type": param_type}
|
|
|
|
# 获取函数中所有必需的参数(即没有默认值的参数)
|
|
required = [
|
|
param.name
|
|
for param in signature.parameters.values()
|
|
if param.default == inspect._empty
|
|
]
|
|
|
|
# 返回包含函数描述信息的字典
|
|
return {
|
|
"type": "function",
|
|
"function": {
|
|
"name": func.__name__, # 函数的名称
|
|
"description": func.__doc__ or "", # 函数的文档字符串(如果不存在则为空字符串)
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": parameters, # 函数参数的类型描述
|
|
"required": required, # 必须参数的列表
|
|
},
|
|
},
|
|
}
|
|
|