當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。