PEP 823 và PEP 824 đề xuất bốn toán tử mới — ?., ?[], ?? và ??= — cho Python 3.16, giúp xử lý None ngắn gọn hơn nhiều. Cả hai đang ở trạng thái Draft, chờ Steering Council xem xét. Python 3.16.0 alpha 2 cũng dự kiến ra mắt hôm nay, 10/11/2026 (PEP 826).
Nếu bạn từng viết những đoạn if x is not None lồng nhau chỉ để lấy một thuộc tính sâu trong object, bạn sẽ hiểu vì sao đề xuất này gây chú ý — lần đầu sau hơn 10 năm từ PEP 505 (2015).
Toán tử ?. và ?[] (PEP 823)
PEP 823, do Marc Mueller soạn thảo và Guido van Rossum bảo trợ, đề xuất hai toán tử truy cập “nhận biết None”: vế trái là None thì chuỗi truy cập dừng lại và trả về None, thay vì ném AttributeError hay TypeError.
# Cách viết hôm naydef get_customer_name(data): customer = data.customer if customer is not None: user = customer.user if user is not None: return user.name.lower() return None# Với PEP 823 (đề xuất)def get_customer_name(data): return data.customer?.user?.name.lower()
Lưu ý: ?. chỉ kiểm tra None, không kiểm tra giá trị falsy như 0 hay chuỗi rỗng, và không xử lý thuộc tính bị thiếu hoàn toàn — với dict, bạn vẫn cần .get() kết hợp ?[].
Toán tử ?? và ??= (PEP 824)
PEP 824 tách riêng hai toán tử hợp nhất giá trị mặc định: ?? trả về vế trái trừ khi nó là None, còn ??= chỉ gán khi biến hiện tại đang là None.
age = user_age ?? "unknown" # chỉ thay thế khi user_age là Noneconfig.timeout ??= 30 # chỉ gán 30 khi timeout đang là None
Khác biệt với or rất thực tế: user_age or "unknown" thay cả số 0 bằng "unknown", còn ?? chỉ phản ứng với None. Lưu ý: ?? có độ ưu tiên thấp hơn and và or — hãy dùng dấu ngoặc khi trộn chúng.
Vì sao tranh cãi hơn 10 năm chưa ngã ngũ
Ý tưởng này không mới: PEP 505 đã đề xuất từ 2015 rồi bị hoãn. Lần này hai PEP tách ý tưởng làm đôi để chấp thuận độc lập từng phần. Hai luồng thảo luận đã có gần 200 bài đăng, ý kiến chia đôi: người ủng hộ thích sự gọn gàng, người phản đối chê cú pháp mới khó dạy, khó đọc và “không đủ Pythonic”. Steering Council chưa đưa ra quyết định.
Điều này có ý nghĩa gì với bạn
Trước mắt, đừng dùng ?. hay ?? trong dự án thật — cú pháp này vẫn gây SyntaxError trên mọi phiên bản Python. Hãy thử demo trực tuyến và rà soát codebase: chỗ nào dùng or để gán giá trị mặc định mà chỉ muốn chặn None chính là nơi ?? sẽ giúp ích. Với Django hay FastAPI, dữ liệu lồng nhau rất phổ biến, nên cú pháp gọn hơn sẽ giảm code phòng thủ. Quyết định cuối cùng sẽ rõ trước tháng 5/2027, khi Python 3.16 đóng băng tính năng.
Bài viết liên quan
- Python 3.15.0 chính thức ra mắt ngày 9/10: lazy import, JIT nhanh hơn và UTF-8 mặc định
- 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
Câu hỏi thường gặp
Dùng được ?. và ?? ngay bây giờ chưa?
Chưa. Đây mới là đề xuất Draft; mọi phiên bản Python đã phát hành đều báo SyntaxError. Bạn chỉ có thể thử qua demo trực tuyến.
?? khác or ở điểm nào?
or thay thế mọi giá trị falsy (None, 0, “”, []), còn ?? chỉ thay thế None. Với user_age = 0, or cho ra “unknown” (sai), còn ?? giữ nguyên 0.
Hai PEP có bắt buộc đi cùng nhau không?
Không. Mỗi PEP có thể được chấp thuận độc lập; Steering Council có thể chỉ chọn một trong hai.
Khi nào có quyết định cuối cùng?
Chưa có thời hạn cụ thể. Python 3.16 đóng băng tính năng tháng 5/2027, bản chính thức dự kiến 5/10/2027.
💬 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.
