[Các vấn đề của Python 3.10] Không dùng nữa

By manhnv, at: 21:12 Ngày 12 tháng 8 năm 2025

Thời gian đọc ước tính: __READING_TIME__ minutes

Python 3.10 issues
Python 3.10 issues

 

1) from collections import X bị lỗi (Mapping/MutableMapping/Iterable, v.v.)

 

Triệu chứng

 

  • ImportError: cannot import name 'Mapping' from 'collections'
     

  • Lỗi tương tự cho MutableMapping, Iterable, Sequence, v.v.

 

Tại sao

 

Các ABC đã ngừng được xuất lại từ collections trong phiên bản 3.10. Bạn phải nhập chúng từ collections.abc. Điều này đã được cảnh báo trong nhiều năm và cuối cùng đã thay đổi trong 3.10.

 

Khắc phục (thay thế trực tiếp)

 

# cũ
from collections import Mapping, MutableMapping, Iterable

# mới
from collections.abc import Mapping, MutableMapping, Iterable

 

Ngăn chặn điều đó lần tới

 

  • Tìm kiếm mã của bạn và các mẫu cho from collections import.
     

  • Thêm quy tắc linter hoặc kiểm tra CI bị lỗi trên from collections import (Mapping|MutableMapping|Iterable|...).
     

  • Nếu một dependency vẫn còn imports from collections, hãy nâng cấp nó hoặc vá cục bộ.

 

2) module parser bị loại bỏ

 

Triệu chứng

 

  • ModuleNotFoundError: No module named 'parser'

  • Các công cụ dựa vào nội bộ của bộ phân tích LL(1) cũ sẽ ngừng hoạt động.

 

Tại sao

 

CPython đã chuyển sang bộ phân tích cú pháp PEG trong phiên bản 3.9. Module bộ phân tích cú pháp cũ và các API C liên quan đã bị loại bỏ trong phiên bản 3.10.

 

Khắc phục / Các đường dẫn di chuyển

 

  • Nếu bạn phân tích mã Python: sử dụng ast hoặc các thư viện hiện đại như LibCST / Parso.
     

  • Nếu bạn tạo/kiểm tra mã byte: sử dụng ast, dis, hoặc các API nội quan cấp cao hơn.
     

  • Nếu bạn phụ thuộc vào ngữ pháp kiểu lib2to3/pgen2, hãy lên kế hoạch di chuyển - những thứ đó sẽ không phân tích các thay đổi ngữ pháp trong tương lai một cách đáng tin cậy.

 

 

Ngăn chặn điều đó lần tới

 

  • Tránh phụ thuộc vào các nội bộ không được ghi chép; ưu tiên ast và các thư viện phân tích được bảo trì tốt.
     

  • Xem lướt qua các phần “Đã loại bỏ” của mỗi Tin mới trước khi nâng cấp.

 

3) parameter loop= của asyncio bị loại bỏ

 

Triệu chứng

 

  • TypeError: ... got an unexpected keyword argument 'loop'
     

  • Mã bị lỗi như asyncio.Queue(loop=loop), asyncio.Lock(loop=loop), asyncio.gather(..., loop=loop).

 

 

Tại sao

 

loop= đã bị loại bỏ; trong phiên bản 3.10, nó bị loại bỏ khỏi hầu hết các API cấp cao. Vòng lặp sự kiện hiện được phát hiện thông qua asyncio.get_running_loop(), hoặc được quản lý bởi asyncio.run().

 

Khắc phục (các mẫu điển hình)

 

# cũ
loop = asyncio.get_event_loop()
q = asyncio.Queue(loop=loop)
lock = asyncio.Lock(loop=loop)


# mới
async def main():
    q = asyncio.Queue()
    lock = asyncio.Lock()

asyncio.run(main())

 

  • Cần đối tượng vòng lặp? Bên trong một coroutine: loop = asyncio.get_running_loop().
     

  • Tạo các tác vụ: ưu tiên asyncio.create_task() bên trong mã đang chạy.

 

Ngăn chặn điều đó lần tới

 

  • Giữ cho phong cách async của bạn “hiện đại”: asyncio.run, create_task, get_running_loop chỉ khi cần thiết.
     

  • Trong các thư viện, tránh phơi bày việc xáo trộn vòng lặp cho người dùng.

 

4) cảnh báo loại bỏ distutils

 

Triệu chứng

 

  • Cảnh báo như: distutils bị đánh dấu là lỗi thời và sẽ bị loại bỏ trong Python 3.12.

 

Tại sao

 

PEP 632: distutils đã bị đánh dấu là lỗi thời trong phiên bản 3.10, bị loại bỏ hoàn toàn trong phiên bản 3.12.

 

Khắc phục (backend xây dựng hiện đại)

 

# pyproject.toml
[build-system]
requires = ["setuptools>=64", "wheel"]
build-backend = "setuptools.build_meta"

 

  • Thay thế các import từ distutils... bằng các tương đương trong Setuptools hoặc packaging.

 

Ngăn chặn điều đó lần tới

 

  • Theo dõi các bản cập nhật PyPA và PEP; tránh các API đóng gói trong stdlib bị đánh dấu là sẽ loại bỏ.

 

5) Những điều cần lưu ý nhỏ hơn nhưng đáng chú ý

 

 

 

Sơ đồ nâng cấp

 

  1. Chạy kiểm thử trên 3.10 sớm (sử dụng tox/ma trận CI).
     

  2. Báo lỗi với các cảnh báo loại bỏ: pytest -W error::DeprecationWarning
     

  3. Tự động hóa sửa lỗi: thay thế from collections import bằng collections.abc, loại bỏ loop= trong asyncio.
     

  4. Hiện đại hóa đóng gói với pyproject.toml.
     

  5. Ghim và nâng cấp các dependency.
     

  6. Đọc Tin mới trong 3.10 trước khi triển khai.

 

Tag list:

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.