Source code for stouputils.decorators.silent


# Imports
from collections.abc import Callable
from functools import wraps
from typing import Any, overload

from ..ctx.muffle import Muffle
from .common import get_wrapper_name, set_wrapper_name


# Decorator that make a function silent (disable stdout)
@overload
def silent[T](
	func: Callable[..., T],
	*,
	mute_stderr: bool = False
) -> Callable[..., T]: ...

@overload
def silent[T](
	func: None = None,
	*,
	mute_stderr: bool = False
) -> Callable[[Callable[..., T]], Callable[..., T]]: ...

[docs] def silent[T]( func: Callable[..., T] | None = None, *, mute_stderr: bool = False ) -> Callable[..., T] | Callable[[Callable[..., T]], Callable[..., T]]: """ Decorator that makes a function silent (disable stdout, and stderr if specified). Alternative to :py:class:`~stouputils.ctx.Muffle`. Args: func (Callable[..., T] | None): Function to make silent mute_stderr (bool): Whether to mute stderr or not Examples: >>> @silent ... def test(): ... print("Hello, world!") >>> test() >>> @silent(mute_stderr=True) ... def test2(): ... print("Hello, world!") >>> test2() >>> silent(print)("Hello, world!") """ def decorator(func: Callable[..., T]) -> Callable[..., T]: @wraps(func) def wrapper(*args: tuple[Any, ...], **kwargs: dict[str, Any]) -> Any: # Use Muffle context manager to silence output with Muffle(mute_stderr=mute_stderr): return func(*args, **kwargs) set_wrapper_name(wrapper, get_wrapper_name("stouputils.decorators.silent", func)) return wrapper # Handle both @silent and @silent(mute_stderr=...) if func is None: return decorator return decorator(func)