Some checks failed
Analysis / SonarCloud (push) Successful in 54s
Analysis / SonarCloud (pull_request) Successful in 48s
Tests / Build and Test (3.11) (pull_request) Failing after 1m2s
Tests / Build and Test (3.12) (pull_request) Failing after 1m0s
Tests / Build and Test (3.13) (pull_request) Failing after 59s
88 lines
2.4 KiB
Python
88 lines
2.4 KiB
Python
import inspect
|
|
from typing import Any, Dict
|
|
from typing import Callable
|
|
|
|
|
|
def supports_argument(func: Callable[..., Any], arg_name: str) -> bool:
|
|
"""Check whether a function has a specific argument.
|
|
|
|
Args:
|
|
func (Callable[..., Any]): Function to be inspected.
|
|
arg_name (str): Argument to be checked.
|
|
|
|
Returns:
|
|
bool: True if argument is supported and False if not.
|
|
"""
|
|
if hasattr(func, "__code__"):
|
|
return arg_name in inspect.signature(func).parameters
|
|
|
|
if hasattr(func, "__doc__"):
|
|
if doc := func.__doc__:
|
|
first_line = doc.splitlines()[0]
|
|
return arg_name in first_line
|
|
|
|
return False
|
|
|
|
|
|
def nested_set(
|
|
target: Dict[str, Any], value: Any, *path: str, create_missing: bool = True
|
|
) -> Dict[str, Any]:
|
|
"""Set the key by its path to the value
|
|
|
|
Args:
|
|
target (Dict[str, Any]): Dictionary to perform the modification on.
|
|
value (Any): New value.
|
|
*path (str): Path to the key.
|
|
create_missing (:obj:`bool`, optional): Create keys on the way if they're missing. Defaults to True.
|
|
|
|
Raises:
|
|
KeyError: Key is not found under the provided path.
|
|
|
|
Returns:
|
|
Dict[str, Any]: Modified dictionary.
|
|
"""
|
|
target_copy: Dict[str, Any] = target
|
|
|
|
for key in path[:-1]:
|
|
if key in target_copy:
|
|
target_copy = target_copy[key]
|
|
elif create_missing:
|
|
target_copy = target_copy.setdefault(key, {})
|
|
else:
|
|
raise KeyError(
|
|
f"Key '{key}' is not found under path provided ({path}) and create_missing is False"
|
|
)
|
|
|
|
if path[-1] in target_copy or create_missing:
|
|
target_copy[path[-1]] = value
|
|
|
|
return target
|
|
|
|
|
|
def nested_delete(target: Dict[str, Any], *path: str) -> Dict[str, Any]:
|
|
"""Delete the key by its path.
|
|
|
|
Args:
|
|
target (Dict[str, Any]): Dictionary to perform the modification on.
|
|
|
|
Raises:
|
|
KeyError: Key is not found under the provided path.
|
|
|
|
Returns:
|
|
Dict[str, Any]: Modified dictionary.
|
|
"""
|
|
target_copy: Dict[str, Any] = target
|
|
|
|
for key in path[:-1]:
|
|
if key in target_copy:
|
|
target_copy = target_copy[key]
|
|
else:
|
|
raise KeyError(f"Key '{key}' is not found under path provided ({path})")
|
|
|
|
if path[-1] in target_copy:
|
|
del target_copy[path[-1]]
|
|
else:
|
|
raise KeyError(f"Key '{path[-1]}' is not found under path provided ({path})")
|
|
|
|
return target
|