from typing import Any, Type, Iterable
import copy
import orjson
#==========================================================================================#
# >>>>> ФУНКЦИИ ПРЕОБРАЗОВАНИЯ ТИПОВ ДАННЫХ <<<<< #
#==========================================================================================#
[документация]
def Copy(data: Any) -> Any:
"""
Выполняет глубокое копирование объекта с автоматическим определением наилучшего метода.
Объекты, которые могут быть сериализованы в JSON (`dict`, `list`, `tuple`), копируются с помощью десериализации/сериализации библиотекой **orjson**. В остальных случаях вызывается `copy.deepcopy()`.
:param data: Копируемый объект.
:type data: Any
:return: Копия объекта.
:rtype: Any
"""
try: return orjson.loads(orjson.dumps(data))
except: return copy.deepcopy(data)
[документация]
def StringifyFloat(number: float, round_factor: int = 2) -> str:
"""
Преобразует число с плавающей запятой в строку, отсекая `.0` в конце при наличии.
:param number: Преобразуемое число.
:type number: float
:param round_factor: Оставляемое количество символов после запятой.
:type round_factor: int
:return: Полученная строка.
:rtype: str
"""
String = str(round(number, round_factor))
if String.endswith(".0"): String = String[:-2]
return String
[документация]
def StringToBool(value: str, literals: Iterable[str] = ("false", "0")) -> bool:
"""
Преобразует строку в логический тип, учитывая её содержимое.
Например, `"false"` будет приведено к `False`, в отличие от стандартной реализации.
:param value: Преобразуемая строка.
:type value: str
:param literals: Набор строк, интерпретируемых как `False`.
:type literals: Iterable[str]
:return: Результирующее значение.
:rtype: bool
"""
if value.lower() in literals: return False
return bool(value)
[документация]
def ToIterable(value: Any, iterable_type: Type[Iterable] = tuple, exclude: tuple[Type[Iterable], ...] = (bytes, str)) -> Iterable:
"""
Преобразует значение в итерируемый тип.
:param value: Обрабатываемое значение.
:type value: Any
:param iterable_type: Целевой тип итерируемого контейнера. По умолчанию `tuple`.
:type iterable_type: Type[Iterable]
:param exclude: Типы-исключения, условно считающиеся неитерируемыми. По умолчанию `bytes`, `str`.
:type exclude: tuple[Type[Iterable], ...]
:return: Приведённое к итерируемому типу значению.
:rtype: Iterable
"""
if isinstance(value, Iterable) and not isinstance(value, exclude): return value
return iterable_type([value])
[документация]
def Zerotify(value: Any) -> Any:
"""
Преобразует значения, логически интерпретируемые в `False`, в тип `None`.
:param value: Проверяемое значение.
:type value: Any
:return: Возвращает `None` при возможности логической интерпретации значения в `False`. Иначе возвращает переданное значение.
:rtype: Any
"""
return None if not value else value
#==========================================================================================#
# >>>>> ФУНКЦИИ РАБОТЫ СО СТРОКАМИ <<<<< #
#==========================================================================================#
[документация]
def MultipleReplace(string: str, values: Iterable[str], new_value: str) -> str:
"""
Поочердёно выполняет замену подстрок в строке на новое значение.
:param string: Обрабатываемая строка.
:type string: str
:param values: Последовательность заменяемых значений.
:type values: Iterable[str]
:param new_value: Новое значение для подстановки.
:type new_value: str
:return: Обработанная строка.
:rtype: str
"""
for Value in values: string = string.replace(Value, new_value)
return string
[документация]
def RemoveRecurringSubstrings(string: str, substring: str) -> str:
"""
Удаляет из строки подряд идущие повторяющиеся подстроки.
:param string: Обрабатываемая строка.
:type string: str
:param substring: Удаляемая подстрока.
:type substring: str
:return: Обработанная строка.
:rtype: str
"""
while substring + substring in string: string = string.replace(substring + substring, substring)
return string
[документация]
def StripAlpha(text: str) -> str:
"""
Удаляет из строки начальные и конечные небуквенные символы.
:param text: Обрабатываемая строка.
:type text: str
:return: Обработанная строка.
:rtype: str
"""
Start, End = 0, len(text)
while Start < End and not text[Start].isalpha(): Start += 1
while End > Start and not text[End - 1].isalpha(): End -= 1
return text[Start:End]
[документация]
def CheckForCyrillic(text: str) -> bool:
"""
Проверяет, имеются ли кирилические символы в строке.
:param text: Проверяемая строка.
:type text: str
:return: Возвращает `True`, если строка содержит хотя бы один кирилический символ.
:rtype: bool
"""
Alphabet = set("абвгдеёжзийклмнопрстуфхцчшщъыьэюя")
return any(Char in Alphabet for Char in text.lower())
[документация]
def IsNotAlpha(text: str) -> bool:
"""
Проверяет, состоит ли строка целиком из небуквенных символов.
:param text: Проверяемая строка.
:type text: str
:return: Возвращает `True` для строки, каждый символ которой при проверке `isalpha()` считается небуквенным.
:rtype: bool
"""
return not any(Char.isalpha() for Char in text)
#==========================================================================================#
# >>>>> ФУНКЦИИ РАБОТЫ СО СЛОВАРЯМИ <<<<< #
#==========================================================================================#
[документация]
def MergeDictionaries(base_dictionary: dict, mergeable_dictionary: dict, overwrite: bool = False) -> dict:
"""
Объединяет словари.
:param base_dictionary: Словарь, в который выполняется копирование.
:type base_dictionary: dict
:param mergeable_dictionary: Словарь, из котрого выполняется копирование.
:type mergeable_dictionary: dict
:param overwrite: Указывает, нужно ли перезаписывать значения конфликтующих ключей базового словаря. По умолчанию `False`.
:type overwrite: bool
:return: Словарь, образованный слиянием двух переданных словарей.
:rtype: dict
"""
for key, value in mergeable_dictionary.items():
if overwrite or key not in base_dictionary:
base_dictionary[key] = value
return base_dictionary
[документация]
def ReplaceDictionaryKey(dictionary: dict, old_key: Any, new_key: Any) -> dict:
"""
Заменяет ключ в словаре, сохраняя исходный порядок элементов.
:param dictionary: Обрабатываемый словарь.
:type dictionary: dict
:param old_key: Старый ключ.
:type old_key: Any
:param new_key: Новый ключ.
:type new_key: Any
:raises KeyError: Выбрасывается при отсутствии старого ключа в словаре.
:return: Обработанный словарь.
:rtype: dict
"""
Result = dict()
if old_key not in dictionary.keys(): raise KeyError(old_key)
for Key in dictionary.keys():
if Key == old_key: Result[new_key] = dictionary[old_key]
else: Result[Key] = dictionary[Key]
return Result