Python 3.12+astпонятие
ast.ParamSpec
параметры типов
Узел параметра типа **P в квадратных скобках (Python 3.12): name — строка, с 3.13 ещё default_value.
Синтаксис
ast.ParamSpec(name, default_value=None)
Звёздочки в поле name не попадают: для **P name равно 'P', и вид параметра определяется только типом узла. Границы у ParamSpec нет — поля bound нет, в отличие от TypeVar. Старая запись P = ParamSpec('P') в ast — это Assign с вызовом, а не ast.ParamSpec.
Примеры
import ast
f = ast.parse('def deco[**P, R](fn): ...').body[0]
print([type(p).__name__ for p in f.type_params]) # → ['ParamSpec', 'TypeVar']
print(f.type_params[0].name, hasattr(f.type_params[0], 'bound')) # → P False
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности