Source code for yayaml.tools
"""Various tools"""
import re
from typing import List, Union
import numpy as np
# -----------------------------------------------------------------------------
[docs]def eval_simple_math_expr(s: str) -> Union[int, float]:
"""Evalautes simple mathematical expressions, given by strings.
Supports: +, -, *, **, /, e-X, eX, inf, nan
"""
# Remove spaces
expr_str = s.replace(" ", "")
# Parse some special strings
if expr_str in ["nan", "NaN"]:
return float("nan")
# NOTE these will cause errors if emitted file is not read by python!
elif expr_str in ["np.inf", "inf", "INF"]:
return np.inf
elif expr_str in ["-np.inf", "-inf", "-INF"]:
return -np.inf
# remove everything that might cause trouble -- only allow digits, dot, +,
# -, *, /, and eE to allow for writing exponentials, and parentheses
expr_str = re.sub(r"[^0-9eE\-.+\*\/\(\)]", "", expr_str)
# Try to eval
return eval(expr_str)
[docs]def listgen(
*,
from_range: list = None,
unique: bool = False,
sort: bool = True,
append: list = None,
remove: list = None,
) -> List[int]:
"""Generates a list of integer elements.
Args:
from_range (list, optional): range arguments to use as the basis of the
list
unique (bool, optional): Whether to ascertain uniqueness of elements
sort (bool, optional): Whether to sort the list before returning
append (list, optional): Additional elements to append to the list
remove (list, optional): Elements to remove all occurrences of
Returns:
List[int]: The generated list
"""
l = []
if from_range:
l += list(range(*from_range))
if append:
l += append
if remove:
for element_to_remove in list(set(remove)):
while element_to_remove in l:
l.remove(element_to_remove)
if unique:
l = list(set(l))
if sort:
l.sort()
return l