Source code for at.load.parser
from __future__ import annotations
__all__ = ["StrParameter", "StrParser"]
import abc
from typing import Any
[docs]
class StrParser(abc.ABC):
"""Abstract base class for string expression parsers.
This class defines the interface for parsers that can evaluate string expressions.
Concrete implementations should provide the evaluate method.
"""
[docs]
@abc.abstractmethod
def evaluate(self, expr: str) -> Any:
"""Evaluate a string expression in the context of this parser.
Args:
expr: The string expression to evaluate
Returns:
The result of evaluating the expression
"""
...
[docs]
class StrParameter:
"""String expression parameter.
A StrParameter represents an expression which can be evaluated in the context
of a StrParser. This is typically used for MAD-X style parameters where
expressions can reference other parameters.
"""
def __init__(self, parser: StrParser, expr: str):
"""Initialise a string parameter.
Args:
parser: StrParser instance defining the context for evaluation
expr: Expression to be evaluated
The expression may contain parameter names, arithmetic operators and
mathematical functions, depending on the capabilities of the parser.
"""
self.expr = expr
self.parser = parser
@property
def value(self) -> Any:
"""Current value of the parameter."""
return self.parser.evaluate(self.expr)
def __str__(self):
return self.expr
def __repr__(self):
return repr(self.value)
def __float__(self):
return float(self.value)
def __int__(self):
return int(self.value)
def __add__(self, other):
return self.value + other
def __radd__(self, other):
return other + self.value
def __mul__(self, other):
return self.value * other
def __rmul__(self, other):
return other * self.value
def __sub__(self, other):
return self.value - other
def __rsub__(self, other):
return other - self.value
def __truediv__(self, other):
return self.value / other
def __rtruediv__(self, other):
return other / self.value
def __pow__(self, other):
return pow(self.value, other)
def __rpow__(self, other):
return pow(other, self.value)
def __neg__(self):
return -self.value
def __pos__(self):
return +self.value
def __abs__(self):
return abs(self.value)
def __gt__(self, other):
return self.value > other
def __ge__(self, other):
return self.value >= other
def __lt__(self, other):
return self.value < other
def __le__(self, other):
return self.value <= other