반응형
250x250
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- aws
- chart.js
- AWS CI/CD 구축하기
- COALESCE
- Python
- Kafka
- redis
- aws cicd
- codedeploy
- docker
- PostgreSQL
- 도커
- bootstrap
- codepipeline
- VPN
- kubeflow
- JavaScript
- Jenkins
- chartjs
- codebuild
- Spring
- Airflow
- codedeploy error
- openlens
- node
- IntelliJ
- Spring Error
- SQL
- java bigdecimal
- Flux
Archives
- Today
- Total
Small Asteroid Blog
[Python] Error : malformed node or string error 본문
728x90
🔥 Python Error: malformed node or string 해결기
최근 API 응답 값을 처리하던 중 다음과 같은 에러를 마주쳤습니다.
ValueError: malformed node or string: <_ast.Name object at 0x...>
에러 상황
API에서 응답 받은 데이터를 json 으로 파싱하는 과정에서 에러가 발생했습니다.
import ast
parsed_data = ast.literal_eval(content)
해당 함수 부분에서 content 가 빈배열로 전달되어서 생기는 에러였습니다.
content = []
# 또는
content = "" # 빈 문자열인 경우도 유사한 에러 발생
에러 원인
ast.literal_eval() 함수는 문자열 형태의 Python 리터럴만 안전하게 평가할 수 있습니다.
즉, 문자열로 감싸진 리스트, 딕셔너리, 숫자, 문자열만 파싱 가능하다는 뜻입니다.
예를 들어:
ast.literal_eval("[1, 2, 3]") # ✅ 가능
ast.literal_eval("{'a': 1}") # ✅ 가능
ast.literal_eval("123") # ✅ 가능
ast.literal_eval("hello") # ❌ 문자열로 감싸지지 않음 → 에러
ast.literal_eval([]) # ❌ 문자열이 아님 → 에러
content가 빈 리스트([]) 형태로 직접 들어온 경우, str 타입이 아니라 list 타입이기 때문에 ast.literal_eval()이 파싱할 수 없고, malformed node or string 에러가 발생합니다.
💡 해결 방법
ast.literal_eval()을 호출하기 전에 content가 문자열인지 먼저 확인하고, 아니라면 문자열로 변환하거나 빈 값으로 처리해야 합니다.
import ast
def safe_literal_eval(content):
if isinstance(content, str) and content.strip() != "":
return ast.literal_eval(content)
return [] # 기본값 지정
parsed_data = safe_literal_eval(content)
또는, content가 애초에 Python 객체로 파싱되어 있다면 literal_eval() 자체를 호출할 필요가 없습니다.
# content 가 이미 파싱된 리스트라면 그대로 사용 가능
if isinstance(content, list):
parsed_data = content
elif isinstance(content, str):
parsed_data = ast.literal_eval(content)
else:
parsed_data = []
ast.literal_eval() 이란?
ast.literal_eval(node_or_string)
- 문자열로 되어 있는 Python literal expression (list, dict, tuple 등)을 안전하게 파이썬 객체로 바꿔주는 함수입니다.
- eval()과 다르게 코드 실행은 하지 않고, 문자열 형태의 리터럴만 파싱합니다.
- 위험한 코드 실행을 방지하기 때문에 외부 입력값을 파싱할 때 선호됩니다.
참고
728x90
반응형
'백엔드 > Python' 카테고리의 다른 글
| [Python] Python 버전 지정 방식의 차이점: "^3.xx" vs ">=3.xx" (0) | 2025.07.28 |
|---|---|
| [Python] 대세는 requirements.txt 대신 uv + pyproject.toml (0) | 2025.07.17 |
| [Python] Gradio streaming, 로컬환경에서는 되고 왜 쿠버환경에서는 안 됐을까? (0) | 2025.06.28 |
| [python]가상환경에서 모듈 에러 ModuleNotFoundError (0) | 2025.06.05 |
| python DotMap (0) | 2025.05.22 |