Python/study
ast.literal_eval()
by 르면가게
2024. 12. 8.
ast.literal_eval()
- 정의:
- ast.literal_eval() 함수는 **파이썬 리터럴(literal)**만 안전하게 평가하여, 문자열에서 파이썬 객체로 변환해주는 함수입니다.
- 리터럴:
- 리터럴은 코드 내에 직접적으로 표현되는 값을 말하며, 숫자, 문자열, 리스트, 튜플, 딕셔너리, 불리언(True, False), None 등이 포함됩니다.
예제
import ast
# 문자열 형태의 리스트
string_list = "[1, 2, 'hello']"
# ast.literal_eval()을 사용하여 리스트로 변환
list_data = ast.literal_eval(string_list)
print(list_data) # 출력: [1, 2, 'hello']
# 문자열 형태의 딕셔너리
string_dict = "{'name': '홍길동', 'age': 30}"
# ast.literal_eval()을 사용하여 딕셔너리로 변환
dict_data = ast.literal_eval(string_dict)
print(dict_data) # 출력: {'name': '홍길동', 'age': 30}
추가 설명
1. ast.literal_eval()의 장점
- 안전성:이 함수는 실행 가능한 코드를 평가하는 일반적인 eval()과 달리, 리터럴 값만 허용합니다. 따라서 코드 실행에 따른 보안 위험을 방지합니다.
- import ast # 안전한 평가 ast.literal_eval("{'key': 'value'}") # 가능 # 위험한 평가 (eval은 실행되지만 literal_eval은 에러 발생) ast.literal_eval("__import__('os').system('rm -rf /')") # SyntaxError 발생
2. 사용 가능한 리터럴
- 다음 리터럴 유형만 변환 가능합니다:
- 숫자 (정수, 실수, 복소수)
- 문자열
- 불리언 (True, False)
- None
- 컨테이너 타입: 리스트, 튜플, 딕셔너리, 집합
3. 지원하지 않는 표현
- 함수 호출, 변수 참조, 연산 등 리터럴이 아닌 표현은 지원하지 않습니다.
- import ast # 지원하지 않는 경우 ast.literal_eval("2 + 3") # ValueError 발생 ast.literal_eval("len([1, 2, 3])") # ValueError 발생
4. 에러 처리
- 입력 문자열이 올바른 리터럴이 아닌 경우 ValueError나 SyntaxError가 발생합니다.
- import ast try: # 올바르지 않은 표현 ast.literal_eval("invalid literal") except (ValueError, SyntaxError) as e: print(f"Error: {e}") # 출력: Error: malformed node or string
요약
- 안전한 문자열 평가를 위해 ast.literal_eval()을 사용.
- 문자열 형태의 리터럴 값을 파이썬 객체로 변환 가능.
- 지원 리터럴: 숫자, 문자열, 리스트, 튜플, 딕셔너리, 집합, 불리언, None.
- 지원하지 않는 기능: 코드 실행, 연산, 함수 호출 등.