function

Utils for manipulating functions.

exception GlobalNameConflictError[source]

Bases: Exception

Raised on a conflict between the globals used to resolve annotations of a wrapped function and its wrapper.

command_wraps(wrapped, assigned=('__module__', '__name__', '__qualname__', '__doc__', '__annotations__'), updated=('__dict__',), *, ignored_conflict_names=frozenset({}))[source]

Update the decorated function to look like wrapped, and update globals for discord.py forwardref evaluation.

See update_wrapper_globals() for more details on how the globals are updated.

Parameters:
  • wrapped (Callable[[ParamSpec(_P)], TypeVar(_R)]) – The function to wrap with.

  • assigned (Sequence[str]) – Sequence of attribute names that are directly assigned from wrapped to wrapper.

  • updated (Sequence[str]) – Sequence of attribute names that are .update``d on ``wrapper from the attributes on wrapped.

  • ignored_conflict_names (Set[str]) – A set of names to ignore if a conflict between them is found.

Return type:

Callable[[Callable[[ParamSpec(_P)], TypeVar(_R)]], Callable[[ParamSpec(_P)], TypeVar(_R)]]

Returns:

A decorator that behaves like functools.wraps(), with the wrapper replaced with the function update_wrapper_globals() returned.

update_wrapper_globals(wrapper, wrapped, *, ignored_conflict_names=frozenset({}))[source]

Create a copy of wrapper, the copy’s globals are updated with wrapped's globals.

For forwardrefs in command annotations, discord.py uses the __global__ attribute of the function to resolve their values. This breaks for decorators that replace the function because they have their own globals.

Warning

This function captures the state of wrapped's module’s globals when it’s called; changes won’t be reflected in the new function’s globals.

Parameters:
Raises:

GlobalNameConflictError – If wrapper and wrapped share a global name that’s also used in wrapped's typehints, and is not in ignored_conflict_names.

Return type:

Callable[[ParamSpec(_P)], TypeVar(_R)]