콘텐츠로 건너뛰기

파이썬 eval 사용법

[

Python eval(): 동적으로 표현식 계산하기

Python Tricks

시작하기 | Python 배우기 | 학습 경로 | 퀴즈 | 주제 둘러보기 | 커뮤니티 채팅 | 오피스 아워 | 팟캐스트 | | 모든 컨텐츠 해제하기

학습자 이야기 | 파이썬 뉴스레터 | 파이썬 취업 게시판 | 팀 소개 | 튜토리얼 작성자로 참여 | 비디오 강사로 지원하기

검색

가입하기 | 로그인


FREE 이메일 시리즈 ▼

🐍 Python Tricks 💌

Python Tricks Dictionary Merge

Python Tricks 받기 »

🔒 스팸 없음. 언제든지 구독 취소 가능.

주제 둘러보기학습 경로
기초중급

  1. Python의 eval() 이해하기
    • 첫 번째 인자: 표현식
    • 두 번째 인자: globals
    • 세 번째 인자: locals
  2. Python의 eval()로 표현식 계산하기
    • 논리 표현식
    • 수학 표현식
    • 일반적인 표현식
  3. eval()의 보안 이슈 최소화하기
    • globals 및 locals 제한하기
    • 내장 함수 이름 사용 제한하기
    • 입력된 변수 이름 제한하기
    • 리터럴만 입력 받기
  4. input()과 함께 Python의 eval() 사용하기
  5. 수학 표현식 계산기 만들기
  6. 결론

Python은 eval() 함수를 통해 문자열이나 컴파일된 코드 형태의 임의의 Python 표현식을 동적으로 평가할 수 있습니다. 이 함수는 문자열 형태나 컴파일된 코드 객체 형태로 전달된 입력으로부터 Python 표현식을 동적으로 평가할 수 있는 편리한 도구입니다.

그러나 Python의 eval()은 사용하기 전에 고려해야 할 중요한 보안 문제가 있습니다. 이 튜토리얼에서는 eval()의 작동 방식과 Python 프로그램에서의 안전하고 효과적인 사용 방법에 대해 알아보겠습니다.

이 튜토리얼에서 배울 내용:

  • Python의 eval() 작동 원리
  • eval()을 사용하여 문자열이나 컴파일된 코드 형태의 임의의 입력을 동적으로 평가하는 방법
  • eval()을 사용할 때 발생할 수 있는 보안 위험을 최소화하는 방법

또한, Python의 eval()을 사용하여 수식을 대화식으로 평가하는 응용 프로그램을 작성하는 방법도 배우게 될 것입니다. 이 예제를 통해 eval()에 대해 배운 모든 내용을 실제 문제에 적용해 볼 수 있습니다. 이 응용 프로그램의 코드를 받고 싶다면 아래 상자를 클릭하세요.

Python의 eval() 이해하기

문자열 형태나 컴파일된 코드 객체 형태로 전달된 입력으로 Python의 내장 함수인 eval()을 사용하여 표현식을 동적으로 평가할 수 있습니다. eval()에 문자열을 전달하면 함수가 문자열을 구문 분석하고 바이트코드로 컴파일한 뒤 Python 표현식으로 평가합니다. 그러나 컴파일된 코드 객체로 eval()을 호출하면 함수가 단순히 평가 단계를 수행합니다. 이는 동일한 입력을 가지고 eval()을 여러 번 호출할 때 매우 편리합니다.

Python의 eval()은 다음과 같은 형식으로 정의됩니다:

eval(expression[, globals[, locals]])

이 함수는 첫 번째 인자인 expression에 평가할 표현식을 전달합니다. 그리고 eval()은 두 개의 선택적 인자를 가집니다:

  1. globals
  2. locals

다음 세 섹션에서 이러한 인자가 어떤 것인지 및 eval()이 이러한 인자를 사용하여 Python 표현식을 동적으로 평가하는 방법에 대해 자세히 알아보겠습니다.

Python의 eval()로 표현식 동적 평가하기

Python의 eval()에 문자열 형태의 입력을 전달하면 함수가 문자열을 구문 분석하고 바이트코드로 컴파일한 뒤 Python으로 평가합니다. 컴파일된 코드 객체로 eval()을 호출할 때는 함수가 단순히 평가 단계를 수행합니다. 이 점을 이용하면 동일한 입력으로 여러 번 eval()을 호출할 때 성능을 향상시킬 수 있습니다.

Python의 eval() 함수를 사용하면 다양한 종류의 표현식을 동적으로 계산할 수 있습니다. 다음은 eval()을 사용하여 동적으로 계산할 수 있는 표현식의 몇 가지 예입니다:

Boolean 표현식

>>> x = 10
>>> eval("x > 5")
True
>>> eval("x < 5")
False

수학 표현식

>>> x = 5
>>> eval("x + 5")
10
>>> eval("x * 2")
10

일반적인 표현식

>>> name = "Alice"
>>> age = 30
>>> eval("My name is {} and I am {} years old".format(name, age))
"My name is Alice and I am 30 years old"

이처럼 Python의 eval()을 사용하면 문자열 형태로 입력된 표현식을 동적으로 계산할 수 있습니다. 이제 eval() 함수에 대한 안전한 사용 방법과 관련된 보안 이슈를 최소화하는 방법에 대해 알아보겠습니다.

eval()의 보안 이슈 최소화하기

eval() 함수는 문자열 형태로 입력된 표현식을 파싱하고 실행하기 때문에 잠재적으로 보안 위험이 따릅니다. 잘못된 사용 시 eval()을 악용할 수 있는 코드 삽입이나 예기치 않은 동작에 취약할 수 있습니다. 또한, eval()을 사용하면 보통의 코드 실행 흐름과 달라져 코드 복잡성과 유지보수에 어려움이 생길 수 있습니다. 이러한 이유로 eval()을 사용하기 전에 보안 문제에 대해 신중하게 고려해야 합니다.

eval()을 사용할 때 보안 위험을 최소화하기 위해 다음과 같은 방법을 사용할 수 있습니다:

globals 및 locals 제한하기

eval()을 호출할 때 globalslocals 인자를 사용하여 전역 및 지역 네임스페이스를 제한할 수 있습니다. 이렇게 하면 eval()이 접근할 수 있는 변수와 함수를 제어하고 실행 컨텍스트를 보다 엄격하게 제한할 수 있습니다.

>>> x = 10
>>> y = 20
>>> eval("x + y", {"x": 5}, {"y": 15})
20

내장 함수 이름 사용 제한하기

eval()을 사용할 때 내장 함수 이름의 사용을 제한하여 보안을 강화할 수 있습니다. globalslocals 인자를 사용하여 변수와 함수의 접근을 제어하는 동시에 __builtins__를 빈 딕셔너리로 설정함으로써 내장 함수를 제한할 수 있습니다.

>>> eval("print('Hello, world!')", {"__builtins__": {}}, {})

입력된 변수 이름 제한하기

eval()을 사용할 때 입력된 변수 이름을 제한하여 eval()에 사용되는 코드의 범위를 제한할 수 있습니다. 이렇게 하면 사용자가 eval()을 악용하여 코드의 범위를 넘어서는 동작을 수행하는 것을 방지할 수 있습니다.

>>> input_expression = "__import__('os').system('rm -rf /')"
>>> eval(input_expression, {"__builtins__": {}}, {})

리터럴만 입력 받기

eval()을 사용할 때 오직 리터럴 값만 받도록 제한하여 보안을 강화할 수 있습니다. 입력이 문자열 형태인 경우 괄호 있는 표현식이나 eval() 함수를 사용할 수 없도록 제한하는 것이 좋습니다.

>>> eval("10", {}, {})
10
>>> eval("(10)", {}, {})

eval() 함수와 함께 input() 함수를 사용하여 사용자 입력을 평가하는 방법에 대해서도 알아보겠습니다.

Python의 eval()과 input() 함께 사용하기

eval() 함수와 input() 함수를 함께 사용하면 사용자로부터 입력받은 표현식을 동적으로 평가할 수 있습니다. 이를 통해 사용자가 입력한 식을 실시간으로 계산하는 응용 프로그램을 만들 수 있습니다.

expression = input("Enter a math expression: ")
result = eval(expression)
print("Result:", result)

위의 예제에서는 사용자로부터 입력된 수학 식을 eval() 함수를 통해 평가하고 결과를 출력합니다. 이렇게 함으로써 사용자는 입력한 식의 결과를 즉시 확인할 수 있습니다.

수식 계산기 만들기

이전에 학습한 eval() 함수와 관련된 내용을 활용하여 대화식 수식 계산기를 만들 수 있습니다. 이 프로그램은 사용자로부터 입력받은 수식을 계산하고 결과를 반환합니다.

while True:
expression = input("Enter a math expression: ")
if expression == "quit":
break
try:
result = eval(expression)
print("Result:", result)
except (SyntaxError, NameError):
print("Invalid expression")

위의 예제에서는 사용자가 “quit”을 입력할 때까지 계속해서 수식을 입력받습니다. 입력된 수식을 eval() 함수를 통해 평가하고 결과를 출력합니다. 만약 잘못된 수식이 입력되었다면 “Invalid expression”을 출력합니다.

결론

이 튜토리얼에서는 Python의 eval()을 사용하여 문자열이나 컴파일된 코드 형태의 표현식을 동적으로 계산하는 방법에 대해 알아보았습니다. eval() 함수를 사용하여 다양한 유형의 표현식을 계산할 수 있으며, 이를 통해 코드 작성 및 품질 향상에 도움이 됩니다. 그러나 eval() 함수의 보안 문제를 최소화하기 위해 고려해야 할 사항도 알아봤습니다.

이제 eval()을 안전하고 효과적으로 사용하는 방법을 숙지하였으므로, 실무에서 동적으로 표현식을 계산하고 활용할 수 있습니다.