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

如何递归创建Python类型注解中GenericAlias类型的默认值?

根据Python类型注解生成默认值的解决方案

一、是否有现成函数?

Python标准库中没有直接提供满足需求的函数,但可以借助typing模块的工具自行实现;如果允许使用第三方库,pydantic的相关机制可间接生成默认值,但依赖标准库的话,自定义递归逻辑是更直接的方案。

二、自定义实现代码(支持Python 3.11)

以下代码通过递归处理所有标准类型,包括基础类型、泛型容器、Optional等,完全匹配你提到的需求:

from typing import get_origin, get_args, Union

def get_default_value(t):
    # 获取类型的原始载体(比如tuple[bool, int]的原始载体是tuple)
    origin = get_origin(t)
    
    # 处理基础非泛型类型
    if origin is None:
        try:
            return t()
        except TypeError:
            # 针对无法直接实例化的类型(如NoneType)返回None
            return None
    
    # 处理固定长度tuple:生成各元素类型默认值组成的元组
    if origin is tuple:
        args = get_args(t)
        # 处理可变长度tuple(如tuple[int, ...]),返回空元组
        if len(args) == 2 and args[1] is Ellipsis:
            return ()
        # 固定长度tuple递归生成每个元素的默认值
        return tuple(get_default_value(arg) for arg in args)
    
    # 处理list/dict/set:返回对应空容器(符合这类可变长度类型的常规默认行为)
    if origin is list:
        return []
    if origin is dict:
        return {}
    if origin is set:
        return set()
    
    # 处理Union/Optional类型:包含None则返回None,否则返回第一个类型的默认值
    if origin is Union:
        args = get_args(t)
        if type(None) in args:
            return None
        return get_default_value(args[0])
    
    # 兜底处理:尝试实例化类型,失败则返回None
    try:
        return t()
    except:
        return None

三、测试示例

# 基础类型
print(get_default_value(bool))  # False
print(get_default_value(int))   # 0
print(get_default_value(str))   # ""

# 固定长度tuple
print(get_default_value(tuple[bool, int]))  # (False, 0)
print(get_default_value(tuple[bool, list[int]]))  # (False, [])

# 可变长度tuple
print(get_default_value(tuple[int, ...]))  # ()

# 容器类型
print(get_default_value(list[int]))  # []
print(get_default_value(dict[str, int]))  # {}
print(get_default_value(set[str]))  # set()

# Optional/Union类型
print(get_default_value(Union[int, None]))  # None
print(get_default_value(Union[str, float]))  # ""

补充说明

  • 可变长度容器(list/dict/set)返回空容器,符合Python中这类类型的常规默认行为;
  • 固定长度tuple会递归生成每个元素的默认值,解决了tuple[bool, int]()返回空元组的问题;
  • 针对Optional类型优先返回None,符合该类型的语义;
  • 无法实例化的特殊类型(如NoneType)会返回None作为兜底默认值。

内容的提问来源于stack exchange,提问作者Eran Zimmerman Gonen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:26:07