본문 바로가기
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.
  • 지원하지 않는 기능: 코드 실행, 연산, 함수 호출 등.

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

@wrap  (0) 2025.01.15
unittest 모듈  (0) 2024.12.08
@staticmethod  (0) 2024.12.08
__str__와 __repr__  (0) 2024.12.08
subprocess.run()  (0) 2024.12.08