TL;DR
Bạn đã viết dấu hai chấm (:) nhưng để trống phần block bên dưới. Python không thể tiếp tục nếu không có ít nhất một câu lệnh ở đó. Hãy thêm code thực tế vào, hoặc dùng pass làm placeholder. Cũng kiểm tra xem bạn có đang trộn lẫn tab và space không — Python 3 coi đó là lỗi nghiêm trọng.
Nguyên Nhân Gây Ra Lỗi
Trong Python, dấu hai chấm không chỉ là dấu câu thông thường — đó là một cam kết. Mọi câu lệnh kết thúc bằng : đều phải có một block thụt lề theo sau. Điều này áp dụng cho if, else, elif, for, while, def, class, with, và try/except/finally.
Bỏ trống phần thân, Python sẽ ném ra lỗi:
IndentationError: expected an indented block
Các Trường Hợp Thường Gặp và Cách Sửa
1. Thân hàm hoặc class trống
Bạn khai báo stub cho hàm hoặc class nhưng chưa viết phần thân:
# Sai
def my_function():
class MyClass:
Sửa — thêm pass:
# Đúng
def my_function():
pass
class MyClass:
pass
2. Thân block chỉ có comment
Comment không được tính là câu lệnh. Python vẫn thấy block trống — cái # TODO đó cũng như không có:
# Sai
def process():
# TODO: triển khai sau
def main():
# sắp có
Sửa — kết hợp comment với pass:
# Đúng
def process():
# TODO: triển khai sau
pass
3. if/else thiếu phần thân
# Sai
if condition:
else:
do_something()
Sửa:
# Đúng
if condition:
pass
else:
do_something()
4. try/except với block trống
# Sai
try:
except ValueError:
handle_error()
Sửa:
# Đúng
try:
risky_call()
except ValueError:
handle_error()
5. Trộn lẫn tab và space
Trường hợp này rất dễ bỏ sót. Code trông có vẻ đã thụt lề trong editor của bạn, nhưng một dòng dùng tab trong khi dòng khác dùng space. Python 3 từ chối thẳng thừng điều này. Bạn có thể thấy TabError, nhưng đôi khi nó lại hiển thị như IndentationError.
# Sai (tab ở một dòng, space ở dòng khác)
def greet():
print("xin chào") # tab
print("thế giới") # space
Chuẩn hóa về dùng space — 4 space mỗi cấp, như PEP 8 khuyến nghị:
def greet():
print("xin chào")
print("thế giới")
Để chuyển đổi hàng loạt trong editor: VS Code → Command Palette → "Convert Indentation to Spaces". Trong vim, chạy :retab. Từ terminal:
expand -t 4 myfile.py > myfile_fixed.py
6. Block vô tình không được thụt lề
# Sai
for item in items:
print(item) # chưa thụt lề
Sửa:
# Đúng
for item in items:
print(item)
Đọc Hiểu Traceback
Thông báo lỗi của Python chỉ thẳng vào vấn đề:
File "script.py", line 5
def helper():
^
IndentationError: expected an indented block
Dòng 5 là nơi Python kỳ vọng phần thân bắt đầu. Hãy nhìn vào dòng trước dấu mũ — đó là dấu hai chấm của bạn. Block bên dưới nó trống hoặc thụt lề sai.
Checklist Nhanh
- Mọi dấu
:ở cuối dòng đều phải có một block thụt lề ở dòng tiếp theo. - Block trống cần có
pass. - Chỉ có comment không đủ để thỏa mãn yêu cầu block — hãy thêm
passbên dưới. - Chỉ dùng space — 4 space mỗi cấp. Cài đặt editor để chèn space khi bấm Tab.
- Chạy
python -m py_compile yourfile.pyđể phát hiện lỗi cú pháp trước khi thực thi.
Kiểm Tra Sau Khi Sửa
Chạy kiểm tra cú pháp nhanh mà không cần thực thi file:
python -m py_compile script.py
echo $? # 0 nghĩa là không có lỗi
Để kiểm tra style và lỗi toàn diện hơn, flake8 bao phủ nhiều hơn:
pip install flake8
flake8 script.py
Không có output nghĩa là không có vấn đề. Nếu py_compile thoát với mã 0, lỗi IndentationError đã được khắc phục.
Cài Đặt Editor để Phòng Tránh Lỗi Này
- VS Code: đặt
"editor.tabSize": 4và"editor.insertSpaces": truetrongsettings.json. - PyCharm: đã mặc định thụt lề 4 space cho các file Python.
- Vim: thêm
autocmd FileType python setlocal expandtab shiftwidth=4 tabstop=4vào.vimrc.

