파이썬의 eval() 함수 제대로 알기
― 문자열을 코드처럼 실행하는 강력한 도구
파이썬(Python)에는 다른 언어에서는 보기 어려운 독특한 함수가 하나 있습니다. 바로 eval() 함수입니다. 이 함수는 문자열로 된 파이썬 표현식을 마치 코드처럼 실행해 주는 기능을 합니다.
한 줄의 문자열을 실행해서 결과값을 얻고 싶을 때, eval()은 매우 강력하고도 간단한 방법이 됩니다. 하지만 사용 시 주의할 점도 반드시 함께 알아야 합니다.
1. eval() 함수란?
eval()은 evaluate(평가하다)의 줄임말로, 문자열로 표현된 파이썬 표현식을 평가하여 결과값을 반환합니다.
기본 구조
eval(expression, globals=None, locals=None)
- expression: 문자열 형태의 파이썬 표현식 (반드시 한 줄이어야 함)
- globals, locals: 실행할 때 사용할 전역/지역 변수 공간 (선택)
2. 기본 사용 예제
a = 1
b = 4
result = eval('a + b')
print(result) # 출력 결과: 5
여기서 'a + b'는 단순한 문자열이지만, eval()은 이를 실제 수식처럼 해석하여 계산합니다.
또는 다음과 같이 직접 수학식을 넣을 수도 있습니다.
print(eval('3 * (2 + 1)')) # 결과: 9
3. 변수와 함께 사용하기
파이썬에서 변수를 동적으로 계산해야 할 일이 있을 때 eval()은 유용합니다.
x = 10
print(eval('x * 2')) # 결과: 20
또한 리스트나 딕셔너리의 인덱싱에도 쓸 수 있습니다.
lst = [10, 20, 30]
print(eval('lst[1] + 5')) # 결과: 25
4. 사용자 입력 계산기 만들기
아래 예제는 간단한 문자열 계산기입니다.
expr = input("계산할 수식을 입력하세요: ")
result = eval(expr)
print("결과:", result)
입력: 3 + 5 * 2
출력: 결과: 13
5. eval()의 위험성
eval()은 매우 강력하지만, 동시에 보안상 위험한 함수입니다. 왜냐하면 사용자가 입력한 문자열을 그대로 실행하기 때문에 악의적인 코드도 실행될 수 있습니다.
예를 들어, 아래 입력은 파일을 삭제할 수 있는 명령어입니다.
eval("__import__('os').remove('중요파일.txt')")
웹 서비스나 공개된 프로그램에서 eval()을 사용할 때는 반드시 사용자 입력을 제한하거나, 다른 안전한 방법을 고려해야 합니다.
6. eval()을 대체할 안전한 방법
수학식이나 데이터 구조만 평가하고 싶다면 eval()보다 안전한 literal_eval()을 사용할 수 있습니다.
from ast import literal_eval
result = literal_eval("[1, 2, 3]")
print(result) # 결과: [1, 2, 3]
이 함수는 리터럴 값(숫자, 문자열, 리스트, 딕셔너리 등) 만 허용하고, 함수 호출이나 시스템 접근은 불가능하므로 훨씬 안전합니다.
7. 사용 정리
목적 | 함수 | 보안 | 설명 |
수식 계산 | eval() | 위험 | "3 * (2 + 1)" 실행 가능 |
단순 구조 해석 | literal_eval() | 안전 | 리스트, 숫자, 문자열만 허용 |
마무리
eval() 함수는 문자열을 직접 실행할 수 있는 매우 유용한 기능이지만, 그만큼 신중한 사용이 필요한 함수입니다. 초보자 단계에서는 다양한 계산이나 변수 평가에 써보면서 그 작동 원리를 익히고, 실제 프로젝트나 사용자 입력이 포함되는 상황에서는 반드시 보안 문제를 고려해야 합니다.
'실버를 위한 코딩 > 오늘의 파이썬 팁' 카테고리의 다른 글
출력 파이썬 코드, print와 pprint (0) | 2025.04.17 |
---|---|
파이썬에서 '식(Expression)과 문(Statement)의 차이 (0) | 2025.04.15 |
os 모듈과 sys 모듈 (1) | 2025.04.14 |
파이썬에서 시스템 명령어 실행하기 (0) | 2025.04.13 |
아나콘다 프롬프트(Anaconda Prompt)와 컴퓨터 기본 터미널 (1) | 2025.01.24 |