from DataType.TypeDef import *
from DataType.ParamDef import *


def train(params: TrainParams):
    """
    后台提交训练请求时,可以参考此方法,从前端传递的参数中取出需要的值
    :param params:
    :return:
    """
    # 存在的参数可以使用name字段获取到
    cpu_num = params.get("gpu_num")
    print(cpu_num)

    # 不存在的参数获取的时候返回None
    th = params.get("th")
    print(th)


def get_train_config_json():
    """
    前端获取训练所需要的参数JSON字符串时,使用str方法即可获取JSON字符串
    :return:
    """
    # 第一种方法:
    # 创建新对象
    params = TrainParams()
    # 从指定文件名中读取配置
    params.read_from_file("TrainParams.json")
    # 转为字符串
    print(str(params))

    # 第二种方法
    # 也可以直接将文本传递给前端,但是可能需要考虑转义符号(\)的处理
    with open("TrainParams.json", "r") as f:
        print(f.read())

    return params


if __name__ == '__main__':
    # 当前端需要获取参数列表时,参照此函数中的实现
    get_train_config_json()

    # 当前端传递回来参数的JSON字符串时,使用下述方法,将字符串反序列化为对象,然后传递给对应的函数
    params = TrainParams()
    params.read_from_str(
        '["{\\"index\\": 0, \\"name\\": \\"gpu_num\\", \\"value\\": 2, \\"description\\": \\"\\", \\"default\\": 0, \\"type\\": \\"I\\"}", "{\\"index\\": 1, \\"name\\": \\"support_cpu\\", \\"value\\": true, \\"description\\": \\"\\", \\"default\\": false, \\"type\\": \\"B\\"}", "{\\"index\\": 2, \\"name\\": \\"labels\\", \\"value\\": 0, \\"description\\": \\"\\", \\"default\\": 0, \\"type\\": \\"E\\", \\"items\\": [\\"dog\\", \\"cat\\"]}"]')
    train(params)