Тип аннотации typing.Concatenate
используется с типами typing.Callable
и typing.ParamSpec
для аннотирования типа вызываемого объекта более высокого порядка, который добавляет, удаляет или преобразует параметры другого вызываемого объекта.
Используется в форме Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable]
. Тип аннотации Concatenate
в настоящее время действителен только при использовании в качестве первого аргумента для Callable
. Последним параметром Concatenate
должен быть ParamSpec
.
Новое в Python 3.10.
typing.Concatenate
:Например, чтобы аннотировать декоратор @with_lock
(см. пример ниже), который обеспечивает threading.Lock
для декорированной функции, можно использовать Concatenate
. Это укажет, что with_lock
ожидает вызываемый объект, который принимает Lock
в качестве первого аргумента и возвращает вызываемый объект с сигнатурой другого типа. В этом случае ParamSpec
указывает, что типы параметров возвращаемого вызываемого объекта зависят от типов параметров передаваемого вызываемого объекта:
from collections.abc import Callable from threading import Lock from typing import Any, Concatenate, ParamSpec, TypeVar P = ParamSpec('P') R = TypeVar('R') # Эта блокировка гарантирует, что только один # поток выполняет функцию в любое время. my_lock = Lock() def with_lock(f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]: '''Типобезопасный декоратор, обеспечивающий блокировку.''' global my_lock def inner(*args: P.args, **kwargs: P.kwargs) -> R: # Укажите блокировку в качестве первого аргумента.. return f(my_lock, *args, **kwargs) return inner @with_lock def sum_threadsafe(lock: Lock, numbers: list[float]) -> float: '''Складывание списка чисел поточно-безопасным способом.''' with lock: return sum(numbers) # Благодаря декоратору, не нужно # передавать блокировку вручную. sum_threadsafe([1.1, 2.2, 3.3])