Исходный код raito.utils.helpers.safe_partial
import inspect
from collections.abc import Callable
from functools import partial, update_wrapper
from typing import Any, ParamSpec, TypeVar, cast
P = ParamSpec("P")
R = TypeVar("R")
[документация]
def safe_partial(func: Callable[P, R], /, **kwargs: Any) -> Callable[P, R]: # noqa: ANN401
"""
Creates a partial version of a function, keeping only keyword arguments
that are accepted by the original function.
:param func: The original function to partially apply
:param kwargs: Keyword arguments to bind
:return: A new callable with partially applied arguments
"""
signature = inspect.signature(func)
valid_parameters = {
name
for name, param in signature.parameters.items()
if param.kind in (param.POSITIONAL_OR_KEYWORD, param.KEYWORD_ONLY)
}
filtered_kwargs = {k: v for k, v in kwargs.items() if k in valid_parameters}
wrapped = partial(func, **filtered_kwargs)
return cast(Callable[P, R], update_wrapper(wrapped, func))