이 글에서는 디스코드 봇에서 IndentationError: unexpected indent가 발생하는 원인과 이를 해결하기 위한 구체적 수정을 정리한다. 호스팅 환경(예: 디스호스트)의 컨테이너에서 실행 중인 app.py에서 발생한 에러를 기준으로, 코드 문법·들여쓰기·변수 선언 문제를 바로잡는 방법을 설명한다.
증상
- 실행 시 콘솔에 다음과 같은 에러 출력:
File "/home/container/app.py", line 467/IndentationError: unexpected indent
- 문제가 발생한 줄은
await i.response.send_message(...)부분 - 함수 내부의 여러 조건문에서 문법적으로 잘못된 구문이나 들여쓰기 불일치 존재
원인
if조건식 뒤에 잘못된 문자 또는 숫자가 붙어있음: 예:if i.user.id != OWNER_ID:1301678305229144227— 콜론 뒤에 숫자가 붙어 파이썬이 문법 오류로 처리- 딕셔너리 정의를
if조건문 안에서 잘못 사용함:if 이름 not in STOCKS = { ... }—=할당을 조건식 안에 사용함 - 들여쓰기(인덴트) 혹은 탭/스페이스 혼용으로 인해
await같은 블록 내부 문장이 예상치 못한 위치에 있어IndentationError발생 STOCK_HISTORY같은 보조 자료구조가 미리 초기화되어 있지 않으면 실행 중 KeyError가 발생할 수 있음
해결 방법
1단계: 문법 및 변수 선언 정리
- 상단에 상수와 자료구조를 명확히 정의한다. 예:
OWNER_ID = 1301678305229144227
STOCKS = {
"우이이": 1000,
"uzi": 1200,
"noda": 900
}
# 주식 히스토리 초기화 (필요에 따라 defaultdict 사용)
from collections import defaultdict
STOCK_HISTORY = defaultdict(list)
for name in STOCKS:
STOCK_HISTORY[name] # 기본 리스트 확보
-
if문에서 비교/멤버십 연산을 올바르게 쓴다:- 잘못:
if i.user.id != OWNER_ID:1301678305229144227 - 올바름:
if i.user.id != OWNER_ID:
- 잘못:
-
멤버십 체크는
in/not in을 사용하고, 할당 연산(=)을 조건 내부에 넣지 않는다:- 잘못:
if 이름 not in STOCKS = { ... } - 올바름:
if 이름 not in STOCKS:
- 잘못:
2단계: 들여쓰기와 비동기 흐름 확인
- 파이썬은 들여쓰기에 민감하다. 에디터에서 탭과 스페이스를 혼용하면
IndentationError가 발생하기 쉬우므로 프로젝트 전체에서 스페이스(권장 4칸)로 통일한다. - 블록 내부의 모든 문장은 동일 수준의 들여쓰기를 유지해야 한다.
- 최종적으로 비동기 함수는 다음처럼 정리한다:
@tree.command(name="주식변동")
async def 주식변동(i: discord.Interaction, 이름: str, 값: int):
if i.user.id != OWNER_ID:
await i.response.send_message("❌ 개발자만 가능", ephemeral=True)
return
if 이름 not in STOCKS:
await i.response.send_message("❌ 없는 주식", ephemeral=True)
return
if 값 < 0 or 값 > 100000:
await i.response.send_message("❌ 범위 오류", ephemeral=True)
return
STOCKS[이름] = 값
STOCK_HISTORY[이름].append(값)
await i.response.send_message(f"{이름} → {값}")
- 위 코드에서
STOCK_HISTORY가 반드시 초기화되어 있어야 함을 재확인한다.
추가 팁:
- 에디터에서 "보이기(공백 문자)" 기능을 켜서 탭/스페이스 혼용을 확인한다.
- 자동 포매터(예:
black)나 린터(예:flake8)를 사용해 문법·스타일 문제를 사전에 잡는다. - 디스호스트와 같은 호스팅 플랫폼에 업로드한 후에는 컨테이너 재시작 또는 배포 재시작을 수행해야 변경사항이 반영된다.
마무리
핵심은 문법 오류(콜론 뒤의 불필요한 텍스트, 잘못된 할당)와 들여쓰기 일관성이다. 위 방식으로 상수와 자료구조를 명확히 선언하고 들여쓰기를 고치면 디스코드 봇의 IndentationError 문제를 해결할 수 있다.