Сообщить об ошибке.

Тип аннотации typing.Concatenate

Тип аннотации 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])