Skip to content

confit.utils.eval

Transformer [source]

Bases: NodeTransformer

An ast NodeTransformer that only allows a subset of the Python AST.

generic_visit [source]

Checks that the node type is allowed.

Source code in confit/utils/eval.py
56
57
58
59
60
61
62
63
64
def generic_visit(self, node):
    """
    Checks that the node type is allowed.
    """
    nodetype = type(node).__name__
    if nodetype not in self.ALLOWED_NODE_TYPES:
        raise RuntimeError(f"Invalid expression: {nodetype} not allowed !")

    return ast.NodeTransformer.generic_visit(self, node)

safe_eval [source]

Evaluate a Python string expression in a safe way. For instance, imports, function calls and builtins are disabled.

Parameters

PARAMETER DESCRIPTION
source

The expression to evaluate

TYPE: str

locals_dict

The local variables to use in the evaluation

TYPE: Optional[Dict[str, Any]] DEFAULT: None

RETURNS DESCRIPTION
Any

The result of the evaluation

Source code in confit/utils/eval.py
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
def safe_eval(source: str, locals_dict: Optional[Dict[str, Any]] = None):
    """
    Evaluate a Python string expression in a safe way.
    For instance, imports, function calls and builtins are disabled.


    Parameters
    ----------
    source: str
        The expression to evaluate
    locals_dict: Optional[Dict[str, Any]]
        The local variables to use in the evaluation

    Returns
    -------
    Any
        The result of the evaluation
    """
    tree = ast.parse(source, mode="eval")

    transformer.visit(tree)
    clause = compile(tree, "<AST>", "eval")
    result = eval(clause, {"__builtins__": {}}, locals_dict)

    return result