Small Asteroid Blog

[Python] Error : malformed node or string error 본문

백엔드/Python

[Python] Error : malformed node or string error

작은소행성☄️ 2025. 6. 28. 16:58
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
반응형