Python 3.14 mang tới một số thay đổi đáng chú ý, trong đó có những thứ đã được cộng đồng chờ đợi nhiều năm. Bài này điểm qua các điểm nổi bật và ý nghĩa thực tế của chúng với công việc hằng ngày.
Chế độ không khóa toàn cục được hỗ trợ chính thức
Khóa thông dịch toàn cục (GIL) từ lâu là giới hạn khiến Python không tận dụng được nhiều lõi CPU trong cùng một tiến trình. Bản dựng không GIL từng xuất hiện ở phiên bản trước dưới dạng thử nghiệm, và tới 3.14 nó chuyển sang trạng thái được hỗ trợ chính thức.
Điều này không có nghĩa mọi chương trình Python đột nhiên chạy song song. Vài điểm cần hiểu rõ:
- Đây là một bản dựng riêng, không phải mặc định khi bạn cài Python
- Các thư viện viết bằng C cần được cập nhật để hoạt động an toàn trong chế độ này
- Code đơn luồng có thể chậm hơn đôi chút so với bản dựng thông thường
- Code đa luồng của bạn phải thực sự an toàn với luồng — GIL trước đây vô tình che giấu nhiều lỗi tranh chấp dữ liệu
Với phần lớn ứng dụng, đa tiến trình vẫn là lựa chọn thực tế hơn ở thời điểm hiện tại. Nhưng đây là bước đi quan trọng về mặt dài hạn, đặc biệt cho các thư viện tính toán khoa học.
Chuỗi mẫu (template string)
Bên cạnh f-string, Python bổ sung t-string. Khác biệt cốt lõi: f-string tạo ra chuỗi ngay lập tức, còn t-string tạo ra một đối tượng giữ nguyên phần văn bản tĩnh và phần giá trị được chèn vào một cách tách biệt.
ten = "Minh"
s = f"Xin chào {ten}" # str, đã ghép xong
t = t"Xin chào {ten}" # Template, còn giữ cấu trúc
Vì sao điều này quan trọng? Nó mở đường cho việc xử lý an toàn những nơi mà ghép chuỗi trực tiếp là nguy hiểm — câu lệnh SQL, mã HTML, lệnh shell. Thư viện có thể nhận template rồi tự escape từng giá trị theo đúng ngữ cảnh, thay vì nhận về một chuỗi đã ghép và không còn phân biệt được đâu là dữ liệu người dùng.
Đây là tính năng dành cho tác giả thư viện nhiều hơn người dùng cuối. Nhưng nếu hệ sinh thái đón nhận, nó có thể loại bỏ được cả một lớp lỗ hổng bảo mật phổ biến.
Chú thích kiểu được đánh giá trễ
Trước đây, chú thích kiểu được đánh giá ngay khi định nghĩa hàm hay lớp. Điều này gây phiền toái với kiểu tham chiếu vòng, buộc người ta phải viết kiểu dưới dạng chuỗi:
class Node:
def them_con(self, con: "Node") -> None: # phải dùng dấu nháy
...
Với cơ chế đánh giá trễ, chú thích chỉ được tính khi thực sự cần đọc tới. Bạn không còn phải dùng thủ thuật nháy kép, và việc nhập khẩu module cũng nhanh hơn vì bớt đi công việc không cần thiết lúc khởi động.
Cú pháp except gọn hơn
# Trước
except (ValueError, TypeError, KeyError) as e:
# Nay có thể viết
except ValueError, TypeError, KeyError as e:
Thay đổi nhỏ về hình thức, nhưng loại bỏ được một chỗ dễ nhầm: người mới hay viết except ValueError, e: theo thói quen từ Python 2 và nhận thông báo lỗi khó hiểu.
Nén Zstandard trong thư viện chuẩn
Thư viện chuẩn bổ sung hỗ trợ thuật toán nén Zstandard, bên cạnh gzip, bz2 và lzma sẵn có. Zstandard cho tỉ lệ nén tốt với tốc độ cao, và đã trở thành lựa chọn phổ biến trong nhiều hệ thống lưu trữ và truyền dữ liệu.
Thông báo lỗi rõ ràng hơn
Mỗi phiên bản gần đây đều cải thiện thông báo lỗi, và 3.14 tiếp tục xu hướng đó. Với người mới học, đây có thể là thay đổi có tác động thực tế lớn nhất — thời gian tiết kiệm được khi thông báo lỗi chỉ thẳng vào vấn đề thay vì bắt bạn đoán mò là rất đáng kể.
Có nên nâng cấp ngay?
Với dự án mới, không có lý do gì để bắt đầu bằng phiên bản cũ hơn.
Với dự án đang chạy, hãy làm theo trình tự: kiểm tra các thư viện phụ thuộc đã hỗ trợ chưa, chạy toàn bộ bộ kiểm thử trên phiên bản mới trong môi trường riêng, rồi mới lên kế hoạch nâng cấp môi trường thật. Các thư viện lớn thường mất một thời gian sau ngày phát hành mới có bản dựng sẵn cho phiên bản mới nhất, và việc phải biên dịch từ mã nguồn có thể gây bất ngờ không dễ chịu.
Nếu bạn quan tâm tới chế độ không khóa toàn cục, hãy coi đó là thứ để thử nghiệm và đo đạc, chưa phải thứ đưa thẳng lên môi trường thật.
Đọc thêm
Ghi chú phát hành chính thức tại docs.python.org luôn là nguồn đáng tin cậy nhất, kèm danh sách đầy đủ các thay đổi và những gì bị loại bỏ. Trước khi nâng cấp, phần “Deprecated” và “Removed” đáng đọc kỹ hơn cả phần tính năng mới — đó là nơi chứa những thứ có thể làm hỏng code hiện có của bạn.