Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/django/utils/inspect.py: 43%
39 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1import functools
2import inspect
5@functools.lru_cache(maxsize=512)
6def _get_func_parameters(func, remove_first):
7 parameters = tuple(inspect.signature(func).parameters.values())
8 if remove_first:
9 parameters = parameters[1:]
10 return parameters
13def _get_callable_parameters(meth_or_func):
14 is_method = inspect.ismethod(meth_or_func)
15 func = meth_or_func.__func__ if is_method else meth_or_func
16 return _get_func_parameters(func, remove_first=is_method)
19def get_func_args(func):
20 params = _get_callable_parameters(func)
21 return [
22 param.name
23 for param in params
24 if param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD
25 ]
28def get_func_full_args(func):
29 """
30 Return a list of (argument name, default value) tuples. If the argument
31 does not have a default value, omit it in the tuple. Arguments such as
32 *args and **kwargs are also included.
33 """
34 params = _get_callable_parameters(func)
35 args = []
36 for param in params:
37 name = param.name
38 # Ignore 'self'
39 if name == "self":
40 continue
41 if param.kind == inspect.Parameter.VAR_POSITIONAL:
42 name = "*" + name
43 elif param.kind == inspect.Parameter.VAR_KEYWORD:
44 name = "**" + name
45 if param.default != inspect.Parameter.empty:
46 args.append((name, param.default))
47 else:
48 args.append((name,))
49 return args
52def func_accepts_kwargs(func):
53 """Return True if function 'func' accepts keyword arguments **kwargs."""
54 return any(p for p in _get_callable_parameters(func) if p.kind == p.VAR_KEYWORD) 54 ↛ exitline 54 didn't finish the generator expression on line 54
57def func_accepts_var_args(func):
58 """
59 Return True if function 'func' accepts positional arguments *args.
60 """
61 return any(p for p in _get_callable_parameters(func) if p.kind == p.VAR_POSITIONAL)
64def method_has_no_args(meth):
65 """Return True if a method only accepts 'self'."""
66 count = len(
67 [p for p in _get_callable_parameters(meth) if p.kind == p.POSITIONAL_OR_KEYWORD]
68 )
69 return count == 0 if inspect.ismethod(meth) else count == 1
72def func_supports_parameter(func, name):
73 return any(param.name == name for param in _get_callable_parameters(func))