Files
LibBotUniversal/src/libbot/utils/misc/_functions.py
Profitroll ef7380ae45
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
WIP: Documentation improvement and format change to Google
2025-07-09 14:32:50 +02:00

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