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
相关产品推荐
相关产品推荐

