python序列化任意结构到dict

def serialize(obj: Any) -> Any:
    """因为Param没有序列化的接口,无法直接转为dict或json,因此编写该函数, 把Param转为dict"""
    if isinstance(obj, np.ndarray):
        return obj.tolist()  # 将 numpy.ndarray 转换为列表
    elif isinstance(obj, (int, float, str, bool)):  # 基本数据类型无需转换
        return obj
    elif isinstance(obj, list):
        return [serialize(item) for item in obj]  # 递归处理列表中的元素
    elif isinstance(obj, dict):
        return {key: serialize(value) for key, value in obj.items()}  # 递归处理字典中的键值对
    elif hasattr(obj, "__dict__"):  # 如果对象有 __dict__ 属性,递归处理其属性
        # 处理该对象的成员变量
        serialized_obj = {}
        for key, value in obj.__dict__.items():
            # 对每个成员变量进行序列化
            serialized_obj[key] = serialize(value)
        return serialized_obj
    else:
        # 如果类型无法识别,尝试通过 dir() 获取其成员变量并递归处理
        serialized_obj = {}
        for attr in dir(obj):
            # 排除系统内置属性和方法
            if not attr.startswith("_") or attr == "_dummy":
                try:
                    value = getattr(obj, attr)
                    serialized_obj[attr] = serialize(value)
                except Exception as e:
                    # 如果访问属性失败(可能是只读属性等),记录错误
                    serialized_obj[attr] = str(e)
        return serialized_obj

你可能感兴趣的:(python,开发语言)