aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar MarkKoz <[email protected]>2020-07-18 13:11:21 -0700
committerGravatar MarkKoz <[email protected]>2020-07-31 23:01:26 -0700
commitd0e92aeaf9142c80aac949e8a01ff31c40e8ca96 (patch)
tree81bd92df9cb400b6021f32447845ba6aed3563fc
parentAdd a function to wrap a decorator to use get_arg_value (diff)
Add a function to get bound args
-rw-r--r--bot/decorators.py7
-rw-r--r--bot/utils/function.py14
2 files changed, 17 insertions, 4 deletions
diff --git a/bot/decorators.py b/bot/decorators.py
index 7f58abd1c..ef4951141 100644
--- a/bot/decorators.py
+++ b/bot/decorators.py
@@ -12,6 +12,7 @@ from discord import Colour, Embed, Member, NotFound
from discord.ext.commands import Cog, Command, Context, check
from bot.constants import Channels, ERROR_REPLIES, RedirectOutput
+from bot.utils import function
from bot.utils.checks import in_whitelist_check, with_role_check, without_role_check
log = logging.getLogger(__name__)
@@ -123,12 +124,10 @@ def mutually_exclusive(namespace: t.Hashable, resource_id: ResourceId) -> t.Call
if callable(resource_id):
log.trace(f"{name}: binding args to signature")
- sig = inspect.signature(func)
- bound_args = sig.bind(*args, **kwargs)
- bound_args.apply_defaults()
+ bound_args = function.get_bound_args(func, args, kwargs)
log.trace(f"{name}: calling the given callable to get the resource ID")
- id_ = resource_id(bound_args.arguments)
+ id_ = resource_id(bound_args)
if inspect.isawaitable(id_):
log.trace(f"{name}: awaiting to get resource ID")
diff --git a/bot/utils/function.py b/bot/utils/function.py
index 23188e79e..3ab32fe3c 100644
--- a/bot/utils/function.py
+++ b/bot/utils/function.py
@@ -1,5 +1,6 @@
"""Utilities for interaction with functions."""
+import inspect
import typing as t
Argument = t.Union[int, str]
@@ -59,3 +60,16 @@ def get_arg_value_wrapper(
return value
return decorator_func(wrapper)
+
+
+def get_bound_args(func: t.Callable, args: t.Tuple, kwargs: t.Dict[str, t.Any]) -> BoundArgs:
+ """
+ Bind `args` and `kwargs` to `func` and return a mapping of parameter names to argument values.
+
+ Default parameter values are also set.
+ """
+ sig = inspect.signature(func)
+ bound_args = sig.bind(*args, **kwargs)
+ bound_args.apply_defaults()
+
+ return bound_args.arguments