문자열로 표현된 딕셔너리를 파이썬 객체로 변환하기
파이썬에서는 딕셔너리(dict)가 문자열 형태로 저장되거나 파일, API 응답 등을 통해 전달되는 경우가 많습니다. 문자열 상태로는 키나 값에 직접 접근할 수 없기 때문에, 이를 다시 딕셔너리 객체로 변환하는 과정이 필요합니다. 대표적인 방법으로 ast.literal_eval()과 json.loads() 두 가지가 있습니다.
방법 1: ast.literal_eval() 사용
ast.literal_eval()은 문자열을 파이썬 표현식으로 안전하게 평가하는 함수입니다. 일반적인 eval()과 달리 임의의 코드를 실행하지 않으며, 문자열, 숫자, 튜플, 리스트, 딕셔너리, 불리언(Boolean), None과 같은 리터럴 구조만 처리하므로 보안 측면에서 훨씬 안전합니다.
import ast
s = "{'baz': 'lol', 'foo': 'bar'}"
d = ast.literal_eval(s)
print(d['foo'], d['baz'])
실행 결과:
bar lol
방법 2: json 모듈 사용
딕셔너리는 JSON 문자열과 구조가 매우 유사하므로, json 모듈의 loads() 함수를 사용해서도 변환할 수 있습니다. 단, JSON 규격에서는 키와 문자열 값을 반드시 큰따옴표(")로 감싸야 하며, 작은따옴표(')를 사용하면 JSONDecodeError가 발생한다는 점에 유의해야 합니다.
import json
s = '{"foo": "bar", "hello": "world"}'
x = json.loads(s)
print(type(x))
print(x['hello'])
실행 결과:
<class 'dict'> world
두 방법의 비교 및 선택 기준
- ast.literal_eval(): 작은따옴표, 튜플, None, True/False 등 파이썬 고유의 문법을 그대로 처리할 수 있으며, 신뢰할 수 없는 외부 입력이라도 안전하게 평가됩니다.
- json.loads(): 변환 속도가 빠르고 JSON 데이터 처리에 최적화되어 있지만, 큰따옴표 사용 등 엄격한 JSON 형식을 요구합니다.
API 응답이나 설정 파일처럼 JSON 형식이 보장된 데이터라면 json.loads()를, 파이썬 코드 내부에서 생성된 딕셔너리 문자열이라면 ast.literal_eval()을 사용하는 것이 좋습니다. 상황에 맞는 도구를 선택하면 더 안정적이고 효율적으로 문자열을 딕셔너리로 변환할 수 있습니다.