def sub_expr(expr: ast.Expr, env: List[Dict[str, str]]) -> ast.Expr: if type(expr) == ast.Name: return ast.Str(env[expr.id]) elif type(expr) == ast.Compare: expr = copy.deepcopy(expr) expr.left = sub_expr(expr.left, env) expr.comparators = [sub_expr(x, env) for x in expr.comparators] return expr elif type(expr) == ast.Str: return expr elif type(expr) == ast.Subscript: if type(expr.value) == ast.Name: if type(expr.slice) == ast.Index: return ast.Str(env[expr.value.id][expr.slice.value.n]) elif type(expr.slice) == ast.Slice: return ast.Str( env[expr.value.id][expr.slice.lower.n:expr.slice.upper.n]) raise Exception(ast.dump(expr))