Học bằng cách đọc theo thứ tự

Type Hints — Để lại ý định trong code với : int và -> str

Học type hints trong Python. Chữ ký hàm def f(x: int) -> str:, khi nào thêm chú thích biến và khi nào không, và cách IDE dùng chúng cho kiểm tra tĩnh — kèm thực hành.

Bài này bao quát type hints — công cụ để để lại ý định «cái gì đi vào đây» bên trong code. Giới thiệu trong Python 3.5, chúng càng ngày càng biểu cảm hơn qua mỗi phiên bản.

Vấn đề «kiểu là gì?» trong ngôn ngữ động

Python là ngôn ngữ kiểu động. Viết value = 10 và nó là int; viết value = "HELLO" và cùng tên giờ là str. Cùng một biến có thể đổi kiểu bất cứ lúc nào — đó là sự linh hoạt. Nhược điểm là khi codebase phát triển hoặc team bắt đầu động vào, «biến này chứa gì?» / «hàm này trả về gì?» trở nên không trả lời được chỉ từ code.

Type hints để lại thông tin đó dưới dạng chú thích. Chúng không thay đổi hành vi runtime. Cái chúng làm là cho người đọc một gợi ý mạnh và để IDE và static analyzer bắt lỗi kiểu trước.

Hàm không hint vs có hint
calc_tax(price, rate)truyền gì?trả gì?đoán sai-> bugcalc_tax(price: int, rate: float)-> intý định đọc đượctừ kiểuIDE (VS Code)cảnh báo giúp
Không có hint, bên gọi phải đoán price nên là gì. Có hint, riêng chữ ký hàm cho bạn biết kiểu input và output.

Chú thích chữ ký hàm

Chữ ký hàm là sân khấu chính cho type hints. Chú thích tham số dạng name: type (dấu hai chấm rồi kiểu sau tên) và kiểu trả về dạng -> type (mũi tên rồi kiểu ở cuối dòng def).

Cấu tạo của chữ ký hàm
def calc_tax(price: intrate: float) -> int:hint tham số(mong int)hint tham số(mong float)hint trả về(trả int)
Dấu hai chấm sau tên tham số khai báo kiểu của tham số, và mũi tên -> sau ) khai báo kiểu trả về. Cặp dấu hai chấm = chú thích tham số; cặp mũi tên = chú thích trả về.
# ❌ không hint — chữ ký không nói cho bạn truyền gì
def calc_tax(price, rate):
    return int(price * (1 + rate))


# ✅ có hint — «int vào, int ra» rõ ràng
def calc_tax(price: int, rate: float) -> int:
    return int(price * (1 + rate))


print(calc_tax(price=1000, rate=0.1))   # 1100

Thêm hint cho tham số và trả về vào calc_tax, máy tính thuế kiểu thương mại điện tử.

① Trên def calc_tax(price, rate):, thêm hint price: intrate: float.

② Thêm -> int trước : để khai báo kiểu trả về.

③ Giữ thân là return int(price * (1 + rate)).

④ Xác nhận với print(calc_tax(price=1000, rate=0.1)) (mong 1100).

(Khi chạy đúng, phần giải thích sẽ hiện ra.)

Python Editor

Chạy code để xem đầu ra

Chú thích biến — Khi nào viết và khi nào không

Type hints cũng làm việc trên biến — cùng hình dạng: name: type = value. Nhưng chú thích biến nhanh chóng trở nên ồn nếu bạn lạm dụng, và ồn giảm khả năng đọc.

# ❌ ồn — giá trị đã nói cho bạn biết kiểu
name: str = "Minh"
age:  int = 30

# ✅ đáng chú thích — container rỗng, init muộn, hoặc kiểu không rõ
results: list = []                       # list rỗng, sẽ append sau
cache:   dict = {}                       # có thể muốn chi tiết kiểu giá trị sau
user_id: int  = fetch_id_from_session()  # làm rõ kiểu mong đợi tại nơi gọi

Khi nghi ngờ: «hàm luôn, biến tiết kiệm»

Trong dự án thực, luôn chú thích chữ ký hàm và method, nhưng chỉ chú thích biến khi kiểu không rõ. age = 30 không cần : int — thêm chỉ là ồn.

Type Hints không bị cưỡng ép lúc runtime

Type hints chỉ là gợi ý. Python không kiểm tra hay cưỡng ép chúng lúc runtime. Một hàm khai báo def f(x: int) vui vẻ chấp nhận f("abc") — hàm chạy như thường. Chỉ sau đó, khi một phép tính sâu trong thân thất bại do không khớp kiểu, bạn mới thấy TypeError hoặc tương tự — và đó là lỗi runtime từ phép tính, không phải từ chính hint.

Vậy sao phải bận tâm? Vì trước khi hàm chạy, editor và static analyzer có thể phát hiện không khớp kiểu. VS Code's Pylance, PyCharm, mypy, pyright — tất cả đều đọc hint của bạn và gạch chân lỗi bằng đỏ, bắt bug trước khi thực thi.

Runner Python trên trình duyệt không hiện cảnh báo IDE

Console trên trang này chỉ chạy code của bạn — nó không có cơ sở kiểm tra kiểu tĩnh như VS Code. Vì vậy viết hoặc vi phạm type hint không bao giờ tạo gạch chân đỏ hay cảnh báo trước khi chạy ở đây. Lợi ích thực sự của type hints — lưới an toàn cảnh báo của editor trước khi bạn chạy — chỉ xuất hiện ở local với VS Code, PyCharm, v.v.

Thêm type hints cho cả class User và hàm describe_user tiêu thụ nó.

① Định nghĩa class User: với __init__(self, name: str, age: int) gán self.name = nameself.age = age (chú thích tham số constructor luôn).

② Thêm instance method greet(self) -> str trả f"Hello, {self.name}" (đừng quên chú thích trả về).

③ Ngoài class, định nghĩa describe_user(user: User) -> str nhận một instance User và trả f"{user.name} ({user.age})".

④ Tạo user = User("Minh", 30) và xác nhận với print(user.greet())print(describe_user(user)).

Python Editor

Chạy code để xem đầu ra

Ba nơi type hints mang lại giá trị

Ba lợi ích của type hints
đọc dễ hơný định hiển thịcảnh báo IDEkhi gõphân tích tĩnhtrong CI
Ngoài khả năng đọc, bạn được cảnh báo IDE thời gian thựckiểm tra tĩnh trước chạy (mypy / pyright) — lợi nhuận cụ thể trên chi phí viết hint.
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Cách nào đúng để chú thích def add(x, y): sao cho cả hai tham số và giá trị trả về là int?

Câu 2Phát biểu nào chính xác nhất về type hints trong Python?

Câu 3Nơi nào được khuyến nghị nhất để thêm type hints?