from typing import Any, Dict


def 获取差异(
    旧字典: Dict[str, Any],
    新字典: Dict[str, Any]
) -> Dict[str, Dict[str, Any]]:
    """
    比较两个字典，返回新增、删除、变化三类差异信息。

    本函数适用于配置对比、版本变更追踪、字段同步前后检查等场景。
    差异结果使用统一结构返回，便于上层逻辑继续处理或直接展示。

    设计特性：
        - 若任一参数不是字典类型，返回空差异结构；
        - 只比较最外层键值对，不递归深入嵌套结构内部；
        - 键会统一转换为字符串后参与差异结果组织；
        - “变化”项会同时保留旧值与新值；
        - 不抛出任何异常，适合作为底层结构比较工具函数使用。

    行为说明：
        - 旧字典中没有、新字典中有      → 记入“新增”；
        - 旧字典中有、新字典中没有      → 记入“删除”；
        - 两边都存在但值不同            → 记入“变化”；
        - 两边都存在且值相同            → 不记入结果。

    Args:
        旧字典 (dict): 作为对比基准的旧字典。
        新字典 (dict): 作为目标状态的新字典。

    Returns:
        dict[str, dict[str, Any]]:
            - 新增：仅存在于新字典中的键值对；
            - 删除：仅存在于旧字典中的键值对；
            - 变化：值发生变化的键，格式为 {"旧值": xxx, "新值": xxx}。
    """
    try:
        空结果: Dict[str, Dict[str, Any]] = {
            "新增": {},
            "删除": {},
            "变化": {},
        }

        if not isinstance(旧字典, dict):
            return 空结果

        if not isinstance(新字典, dict):
            return 空结果

        结果 = {
            "新增": {},
            "删除": {},
            "变化": {},
        }

        旧键集合 = {str(键) for 键 in 旧字典.keys()}
        新键集合 = {str(键) for 键 in 新字典.keys()}

        旧值映射 = {str(键): 值 for 键, 值 in 旧字典.items()}
        新值映射 = {str(键): 值 for 键, 值 in 新字典.items()}

        for 键 in 新键集合 - 旧键集合:
            结果["新增"][键] = 新值映射[键]

        for 键 in 旧键集合 - 新键集合:
            结果["删除"][键] = 旧值映射[键]

        for 键 in 旧键集合 & 新键集合:
            if 旧值映射[键] != 新值映射[键]:
                结果["变化"][键] = {
                    "旧值": 旧值映射[键],
                    "新值": 新值映射[键],
                }

        return 结果
    except Exception:
        return {
            "新增": {},
            "删除": {},
            "变化": {},
        }
