You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.7 KiB
58 lines
1.7 KiB
"""Decorator for validating function calls.""" |
|
from __future__ import annotations as _annotations |
|
|
|
from typing import TYPE_CHECKING, Any, Callable, TypeVar, overload |
|
|
|
from ._internal import _validate_call |
|
|
|
__all__ = ('validate_call',) |
|
|
|
if TYPE_CHECKING: |
|
from .config import ConfigDict |
|
|
|
AnyCallableT = TypeVar('AnyCallableT', bound=Callable[..., Any]) |
|
|
|
|
|
@overload |
|
def validate_call( |
|
*, config: ConfigDict | None = None, validate_return: bool = False |
|
) -> Callable[[AnyCallableT], AnyCallableT]: |
|
... |
|
|
|
|
|
@overload |
|
def validate_call(__func: AnyCallableT) -> AnyCallableT: |
|
... |
|
|
|
|
|
def validate_call( |
|
__func: AnyCallableT | None = None, |
|
*, |
|
config: ConfigDict | None = None, |
|
validate_return: bool = False, |
|
) -> AnyCallableT | Callable[[AnyCallableT], AnyCallableT]: |
|
"""Usage docs: https://docs.pydantic.dev/2.2/usage/validation_decorator/ |
|
|
|
Returns a decorated wrapper around the function that validates the arguments and, optionally, the return value. |
|
|
|
Usage may be either as a plain decorator `@validate_call` or with arguments `@validate_call(...)`. |
|
|
|
Args: |
|
__func: The function to be decorated. |
|
config: The configuration dictionary. |
|
validate_return: Whether to validate the return value. |
|
|
|
Returns: |
|
The decorated function. |
|
""" |
|
|
|
def validate(function: AnyCallableT) -> AnyCallableT: |
|
if isinstance(function, (classmethod, staticmethod)): |
|
name = type(function).__name__ |
|
raise TypeError(f'The `@{name}` decorator should be applied after `@validate_call` (put `@{name}` on top)') |
|
return _validate_call.ValidateCallWrapper(function, config, validate_return) # type: ignore |
|
|
|
if __func: |
|
return validate(__func) |
|
else: |
|
return validate
|
|
|