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

Python3.12+中类/函数/type后[]内*、**及T,*Ts,**P是什么含义?

Python 3.12及以上版本中泛型声明的*与**含义

一、方括号内*(星号)和**(双星号)的核心作用

在Python 3.12+的泛型声明(类、函数、类型别名的方括号参数)中,*和**是PEP 695新增的语法,用来定义可变泛型参数,实现更灵活的泛型复用:

  • *Ts:对应可变数量的位置泛型参数,类似函数中的*args,可接收0个或多个类型作为位置泛型参数
  • **P:对应可变数量的关键字泛型参数,类似函数中的**kwargs,可接收0个或多个带名称的类型作为关键字泛型参数

二、T, *Ts, **P在不同场景的具体含义

1. 类声明中的用法

示例代码:

class ChildClass[T, *Ts, **P]: ...

这里T是第一个必填的位置泛型参数,*Ts接收后续任意数量的额外位置泛型参数,**P接收任意数量的关键字泛型参数。实例化示例:

# T=int, Ts=(str, bool), P={"key": float}
instance = ChildClass[int, str, bool, key=float]

2. 函数声明中的用法

示例代码:

from typing import Callable, tuple

def foo[T, *Ts, **P](arg: T) -> Callable[P, tuple[T, *Ts]]: ...
  • 函数foo的泛型参数规则:T为必填位置泛型,*Ts接收额外位置泛型,**P接收关键字泛型
  • 返回值Callable[P, tuple[T, *Ts]]表示:该函数返回一个可调用对象,此对象接收与P匹配的关键字参数,返回一个元组——元组第一个元素为T类型,后续元素依次对应Ts中的各个类型

3. 类型别名(type关键字)中的用法

示例代码:

from typing import Callable, tuple

type Vat[T, *Ts, **P] = Callable[P, tuple[T, *Ts]]

这里定义了泛型类型别名Vat,泛型参数规则与上述类、函数一致:T为必填位置泛型,*Ts为可变位置泛型,**P为可变关键字泛型。Vat代表的类型是一个可调用对象,接收P对应的关键字参数,返回包含T和Ts类型元素的元组。

补充说明:泛型与函数参数/实参的*、**区别

泛型声明中的*/**和函数参数、调用中的*/**作用完全不同:

  • 函数参数中的*args用于接收可变数量的位置实参,**kwargs用于接收可变数量的关键字实参
  • 函数调用中的*用于解包可迭代对象为位置实参,**用于解包字典为关键字实参

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:22:34