[Vấn đề Python 3.10] Cạm bẫy khi phân tích số phiên bản
By phuongkt, at: 11:11 Ngày 16 tháng 8 năm 2025
Thời gian đọc ước tính: __READING_TIME__ minutes
![[Python 3.10 Issues] Version Number Parsing Pitfalls](/media/filer_public_thumbnails/filer_public/66/e4/66e49031-28d9-4eb9-ba29-930a025cddb9/python_310_issues_version_number_parsing_pitfalls.png__1500x900_q85_crop_subsampling-2_upscale.jpg)
![[Python 3.10 Issues] Version Number Parsing Pitfalls](/media/filer_public_thumbnails/filer_public/66/e4/66e49031-28d9-4eb9-ba29-930a025cddb9/python_310_issues_version_number_parsing_pitfalls.png__400x240_q85_crop_subsampling-2_upscale.jpg)
Triệu chứng
-
Các tập lệnh phát hiện môi trường nhầm lẫn Python 3.10 là Python 3.1.
-
Logic có điều kiện sử dụng so sánh chuỗi cho ra kết quả sai:
if platform.python_version() < "3.9":
...
-
có thể hoạt động không chính xác dưới 3.10.
Tại sao
Một số công cụ và tập lệnh đã so sánh chuỗi phiên bản một cách ngây thơ thay vì phân tích chúng thành các bộ dữ liệu số nguyên. So sánh chuỗi là theo thứ tự từ điển — "3.10" đứng trước "3.9" vì "1" nhỏ hơn "9" ở vị trí ký tự thứ hai.
Vấn đề này ảnh hưởng đến các trình cài đặt pip cũ, cấu hình tox và các tập lệnh triển khai nội bộ không tính đến các phiên bản phụ có hai chữ số. Nó cũng được ghi nhận trong hướng dẫn chuyển đổi sang Python 3.10.
Khắc phục / Thực tiễn tốt nhất
1) Sử dụng sys.version_info để so sánh
import sys
if sys.version_info < (3, 9):
print("Đã phát hiện Python < 3.9")
sys.version_info
trả về một cấu trúc giống bộ dữ liệu: (major, minor, micro, releaselevel, serial) — an toàn cho việc so sánh số.
2) Đối với đóng gói, hãy sử dụng packaging.version
from packaging import version
import platform
if version.parse(platform.python_version()) < version.parse("3.9"):
...
3) Cập nhật công cụ
-
Nâng cấp pip, setuptools, tox và trình chạy CI — các phiên bản mới hơn xử lý 3.10+ chính xác.
-
Kiểm tra các tập lệnh shell và tệp cấu hình cho các so sánh chuỗi thô như:
if [ "$(python3 --version)" \< "Python 3.9" ]; then ...
Cách tránh điều này trong tương lai
-
Luôn phân tích phiên bản bằng số, không phải theo thứ tự từ điển.
-
Kiểm tra các kiểm tra phiên bản của bạn với các ứng cử viên phát hành sắp tới (ví dụ: 3.13.0rc1).
-
Theo dõi lịch phát hành của Hướng dẫn Nhà phát triển Python để dự đoán các phiên bản phụ có hai chữ số.