PEP 823 và PEP 824, do Marc Mueller soạn thảo và Guido van Rossum bảo trợ, đề xuất bốn toán tử nhận biết None cho Python: ?., ?[], ?? và ??=. Cả hai PEP hiện vẫn là bản nháp — cú pháp này vẫn gây lỗi SyntaxError trên mọi phiên bản đã phát hành, kể cả bản alpha đầu tiên của Python 3.16.
Ý tưởng này không mới: PEP 505 đã đề xuất các toán tử tương tự từ năm 2015 nhưng bị hoãn nhiều năm. Lần này, ý tưởng được tách thành hai PEP riêng, mỗi PEP có thể được chấp thuận độc lập, và hai chủ đề thảo luận đã thu hút gần 200 bài viết.
?. và ?[]: truy cập mà không sợ None ở giữa chuỗi
PEP 823 đề xuất toán tử truy cập thuộc tính ?. và truy cập theo chỉ mục ?[]. Nguyên tắc đơn giản: chỉ khi đối tượng bên trái không phải None thì phép truy cập mới chạy; ngược lại, toàn bộ chuỗi ngắt mạch và trả về None.
# Cách viết hôm nay: kiểm tra từng tầngname = Noneif data.customer is not None and data.customer.user is not None: name = data.customer.user.name# Cách viết PEP 823 đề xuất (chưa dùng được)name = data?.customer?.user?.name
Lưu ý: ?. chỉ “né” None, không “né” thuộc tính không tồn tại — nếu đối tượng không phải None nhưng thiếu thuộc tính đó, lỗi vẫn xảy ra. Đây cũng là điểm tranh cãi: None có thể âm thầm “trôi” qua nhiều tầng rồi mới phát tác ở nơi khác.
?? và ??=: giá trị dự phòng chỉ dành cho None
PEP 824 đề xuất toán tử hợp nhất None ?? và gán hợp nhất ??=. Toán tử ?? trả về vế trái, trừ khi vế trái là None thì trả về vế phải, tương đương a if a is not None else b.
Điểm khác biệt lớn nhất với thói quen dùng or: or phản ứng với mọi giá trị falsy, còn ?? chỉ phản ứng với None. Viết user_age or "unknown" sẽ thay cả số 0 và chuỗi rỗng, trong khi user_age ?? "unknown" giữ nguyên 0 và chuỗi rỗng, chỉ thay khi giá trị thực sự là None. Toán tử ??= gán giá trị mới chỉ khi biến hiện tại đang là None, tiện cho việc đặt giá trị mặc định.
# 'or' thay cả 0 và chuỗi rỗng — đôi khi không phải ý bạnage = user_age or "unknown"# '??' theo PEP 824 chỉ thay khi giá trị là None (chưa dùng được)age = user_age ?? "unknown"config ??= default_config
Tranh luận và lộ trình: còn lâu mới chắc chắn
Cả hai PEP đều chưa có trong Python 3.16.0a1 (13/10/2026). Bản alpha thứ hai dự kiến ngày 10/11/2026, bản chính thức của Python 3.16 dự kiến ngày 5/10/2027. Người ủng hộ thích sự chính xác của ??, người phản đối cho rằng ?. chưa đủ trực quan, hoặc các toán tử này “không đủ Pythonic”. Đừng coi đây là tính năng đã chốt.
Điều này có ý nghĩa gì với bạn
Ngay lúc này, bạn không cần — và cũng không thể — viết lại code theo cú pháp mới. Hãy rà lại những chỗ code đang dùng or để đặt giá trị mặc định, và tự hỏi liệu 0 hay chuỗi rỗng có phải là giá trị hợp lệ cần giữ lại hay không. Nếu có, đó chính là những chỗ ?? sẽ giúp ích nhất.
Bài viết liên quan
- Python 3.15 ra mắt ngày 1/10: frozendict, lazy import tường minh và JIT nhanh hơn — checklist trước khi nâng cấp
- Python 3.15 “trượt chân” phút chót: bản chính thức dời sang 9/10 vì lỗi lazy import
- Tạm biệt Python 3.10: bản 3.10.22 là bản cuối cùng, 5 bản vá bảo mật đồng loạt phát hành ngày 1/10
Câu hỏi thường gặp
Khi nào tôi mới dùng được ?. và ???
Chưa có thời điểm cụ thể. Cả hai PEP vẫn là bản nháp, chưa được chấp thuận và chưa có trong bất kỳ phiên bản Python nào, kể cả Python 3.16.0a1.
?? khác gì so với or?
or thay thế mọi giá trị falsy như None, 0 hay chuỗi rỗng. ?? chỉ thay thế None, nên giữ nguyên 0 và chuỗi rỗng.
Liệu cả hai PEP có bắt buộc đi cùng nhau không?
Không. Tác giả đã xác nhận mỗi PEP đều có thể được chấp thuận mà không cần PEP còn lại.
💬 Tin này ảnh hưởng tới dự án của bạn thế nào? Chia sẻ góc nhìn của bạn trong phần bình luận — mình đọc hết và sẽ tổng hợp những ý hay nhất.
Nguồn tham khảo
- Real Python — Python 3.15 Ships and Other Python News for November 2026: https://realpython.com/python-news-november-2026/
- PEP 823 – None-aware access operators: https://peps.python.org/pep-0823/
- PEP 824 – None-coalescing operators: https://peps.python.org/pep-0824/
