You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在类似type()的命令可递归生成pytype风格类型声明?

递归推导集合类型的实现方案

当然有办法实现这种递归的类型推导!虽然Python标准库没有直接提供和你描述完全一致的fancy_type()函数,但我们可以自己动手实现,也有第三方工具能满足需求。

一、自己动手实现递归类型推导函数

最灵活的方式是写一个递归函数,遍历集合的每个元素并推导类型,同时处理异构元素的情况。这里给你一个示例实现:

from typing import Any, Union

def fancy_type(obj: Any) -> str:
    # 处理基础数据类型
    if isinstance(obj, int):
        return "int"
    elif isinstance(obj, float):
        return "float"
    elif isinstance(obj, str):
        return "str"
    elif isinstance(obj, bool):
        return "bool"
    # 处理列表
    elif isinstance(obj, list):
        if not obj:
            return "list[Any]"
        # 收集所有元素的类型,去重
        elem_types = {fancy_type(item) for item in obj}
        if len(elem_types) == 1:
            return f"list[{elem_types.pop()}]"
        else:
            # 异构元素用Union合并
            return f"list[Union[{', '.join(sorted(elem_types))}]]"
    # 处理字典
    elif isinstance(obj, dict):
        if not obj:
            return "dict[Any, Any]"
        key_types = {fancy_type(k) for k in obj.keys()}
        val_types = {fancy_type(v) for v in obj.values()}
        # 统一键的类型,异构则用Union
        key_type = key_types.pop() if len(key_types) == 1 else f"Union[{', '.join(sorted(key_types))}]"
        val_type = val_types.pop() if len(val_types) == 1 else f"Union[{', '.join(sorted(val_types))}]"
        return f"dict[{key_type}, {val_type}]"
    # 处理集合
    elif isinstance(obj, set):
        if not obj:
            return "set[Any]"
        elem_types = {fancy_type(item) for item in obj}
        if len(elem_types) == 1:
            return f"set[{elem_types.pop()}]"
        else:
            return f"set[Union[{', '.join(sorted(elem_types))}]]"
    # 处理元组(保留每个位置的类型)
    elif isinstance(obj, tuple):
        elem_types = [fancy_type(item) for item in obj]
        return f"tuple[{', '.join(elem_types)}]"
    # 处理自定义类或未覆盖的类型
    else:
        return obj.__class__.__name__

测试示例

用你给出的例子测试:

print(fancy_type({1: {"a": 2.2}}))
# 输出: dict[int, dict[str, float]]

对于异构集合,比如包含整数、字符串和浮点数的列表:

print(fancy_type([1, "hello", 3.14]))
# 输出: list[Union[float, int, str]]

这个函数可以根据你的需求扩展,比如添加对datetime、自定义类等类型的支持。

二、第三方工具选项

如果你不想自己写代码,也可以借助专门的类型分析工具:

  • pytype:你提到的pytype本身就具备强大的类型推导能力,它可以分析代码并生成符合PEP 484的类型声明。虽然它主要是作为命令行工具使用,但也可以通过其API在代码中调用相关功能。
  • mypy:另一个流行的类型检查器,同样支持类型推导,你可以利用它的内部模块来实现类似的递归类型分析。

这些工具会更严谨地处理复杂的类型场景,但学习成本会比自己写函数高一些。

内容的提问来源于stack exchange,提问作者Mark Harrison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:56:15