본문 바로가기
Language/Python

eval

by bugbomb 2026. 10. 22.

[AI 도움]

 

1. 문자열이 수식으로 된걸 파싱해야 될때,

 

import ast

# eval() 함수의 위험을 제거하고, 순수 수식에만 적용
# 주의) python 버전에 따라 몇몇이 좀 다름, 아래는 3.8 이상일때, 적용
def safe_eval(expr):
        """
        안전하게 허용된 연산자만 사용해서 계산
        """
        allowed_operators = {
            ast.Add: lambda a,b: a+b,
            ast.Sub: lambda a,b: a-b,
            ast.Mult: lambda a,b: a*b,
            ast.Div: lambda a,b: a/b,
            ast.Pow: lambda a,b: a**b,
            ast.USub: lambda a: -a,
        }

        def eval_node(node):
            if isinstance(node, ast.Constant):
                return node.value
            elif isinstance(node, ast.BinOp):
                op_func = allowed_operators.get(type(node.op))
                if op_func is None:
                    raise ValueError("허용되지 않은 연산자")
                return op_func(eval_node(node.left), eval_node(node.right))
            elif isinstance(node, ast.UnaryOp):
                op_func = allowed_operators.get(type(node.op))
                if op_func is None:
                    raise ValueError("허용되지 않은 연산자")
                return op_func(eval_node(node.operand))
            else:
                raise ValueError("허용되지 않은 표현식")

        tree = ast.parse(expr, mode='eval')
        return eval_node(tree.body)

'Language > Python' 카테고리의 다른 글

Python 참고할만한 동영상  (0) 2020.06.14