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 fromwrapped
towrapper
.updated (
Sequence
[str
]) – Sequence of attribute names that are.update``d on ``wrapper
from the attributes onwrapped
.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 functionupdate_wrapper_globals()
returned.
- update_wrapper_globals(wrapper, wrapped, *, ignored_conflict_names=frozenset({}))[source]¶
Create a copy of
wrapper
, the copy’s globals are updated withwrapped
'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
andwrapped
share a global name that’s also used inwrapped
's typehints, and is not inignored_conflict_names
.- Return type: