Source code for openfisca_core.commons.misc
from __future__ import annotations
import numexpr
from openfisca_core import types as t
[docs]
def empty_clone(original: object) -> object:
    """Create an empty instance of the same class of the original object.
    Args:
        original: An object to clone.
    Returns:
        object: The cloned, empty, object.
    Examples:
        >>> Foo = type("Foo", (list,), {})
        >>> foo = Foo([1, 2, 3])
        >>> foo
        [1, 2, 3]
        >>> bar = empty_clone(foo)
        >>> bar
        []
        >>> isinstance(bar, Foo)
        True
    """
    def __init__(_: object) -> None: ...
    Dummy = type(
        "Dummy",
        (original.__class__,),
        {"__init__": __init__},
    )
    new = Dummy()
    new.__class__ = original.__class__
    return new 
[docs]
def stringify_array(array: None | t.VarArray) -> str:
    """Generate a clean string representation of a numpy array.
    Args:
        array: An array.
    Returns:
        str: ``"None"`` if the ``array`` is ``None``.
        str: The stringified ``array`` otherwise.
    Examples:
        >>> import numpy
        >>> stringify_array(None)
        'None'
        >>> array = numpy.array([10, 20.0])
        >>> stringify_array(array)
        '[10.0, 20.0]'
        >>> array = numpy.array(["10", "Twenty"])
        >>> stringify_array(array)
        '[10, Twenty]'
        >>> array = numpy.array([list, dict(), stringify_array])
        >>> stringify_array(array)
        "[<class 'list'>, {}, <function stringify_array...]"
    """
    if array is None:
        return "None"
    return f"[{', '.join(str(cell) for cell in array)}]" 
[docs]
def eval_expression(
    expression: str,
) -> str | t.BoolArray | t.IntArray | t.FloatArray:
    """Evaluate a string expression to a numpy array.
    Args:
        expression: An expression to evaluate.
    Returns:
        ndarray: The result of the evaluation.
        str: The expression if it couldn't be evaluated.
    Examples:
        >>> eval_expression("1 + 2")
        array(3, dtype=int32)
        >>> eval_expression("salary")
        'salary'
        >>> eval_expression("date of birth")
        'date of birth'
    """
    try:
        return numexpr.evaluate(expression)
    except (KeyError, TypeError, SyntaxError):
        return expression 
__all__ = ["empty_clone", "eval_expression", "stringify_array"]