当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python typing.ParamSpec用法及代码示例


用法:

class typing.ParamSpec(name, *, bound=None, covariant=False, contravariant=False)

参数规范变量。 type variables 的专用版本。

用法:

P = ParamSpec('P')

参数规范变量的存在主要是为了静态类型检查器的好处。它们用于将一个可调用对象的参数类型转发到另一个可调用对象——这种模式常见于高阶函数和装饰器中。它们仅在 Concatenate 中使用,或作为 Callable 的第一个参数,或作为用户定义泛型的参数时才有效。有关泛型类型的更多信息,请参阅Generic

例如,要向函数添加基本日志记录,可以创建一个装饰器add_logging 来记录函数调用。参数说明变量告诉类型检查器传递给装饰器的可调用对象和它返回的新可调用对象具有inter-dependent 类型参数:

from collections.abc import Callable
from typing import TypeVar, ParamSpec
import logging

T = TypeVar('T')
P = ParamSpec('P')

def add_logging(f: Callable[P, T]) -> Callable[P, T]:
    '''A type-safe decorator to add logging to a function.'''
    def inner(*args: P.args, **kwargs: P.kwargs) -> T:
        logging.info(f'{f.__name__} was called')
        return f(*args, **kwargs)
    return inner

@add_logging
def add_two(x: float, y: float) -> float:
    '''Add two numbers together.'''
    return x + y

如果没有 ParamSpec ,之前注释它的最简单方法是使用带有绑定 Callable[..., Any]TypeVar 。然而,这会导致两个问题:

  1. 类型检查器无法对 inner 函数进行类型检查,因为 *args**kwargs 必须键入 Any

  2. 当返回 inner 函数时,add_logging 装饰器的主体中可能需要 cast(),或者必须告诉静态类型检查器忽略 return inner

使用covariant=Truecontravariant=True 创建的参数规范变量可用于声明协变或逆变泛型类型。 bound 参数也被接受,类似于 TypeVar 。然而,这些关键字的实际语义尚未确定。

3.10 版中的新函数。

注意

只能 pickle 在全局范围内定义的参数规范变量。

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 typing.ParamSpec。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。