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

1import functools 

2import inspect 

3 

4 

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 

11 

12 

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) 

17 

18 

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 ] 

26 

27 

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 

50 

51 

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

55 

56 

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) 

62 

63 

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 

70 

71 

72def func_supports_parameter(func, name): 

73 return any(param.name == name for param in _get_callable_parameters(func))