Sửa lỗi 'AttributeError: module collections has no attribute Callable' trong Python 3.10+

beginner🐍 Python2026-07-14| Python 3.10, 3.11, 3.12 và 3.13; phổ biến trên Windows, macOS và Linux khi chạy các gói cũ như Flask 1.x hoặc Jinja2 2.x.

Error Message

AttributeError: module 'collections' has no attribute 'Callable'
#python#collections#python310#backend#debugging

Cách khắc phục nhanh

Python 3.10 cuối cùng đã loại bỏ hoàn toàn một số alias vốn đã bị đánh dấu lỗi thời (deprecated) kể từ phiên bản 3.3. Cách khắc phục rất đơn giản: chuyển đổi các import từ collections sang collections.abc.

# ❌ Lỗi trong Python 3.10+
import collections
def is_function(obj):
    return isinstance(obj, collections.Callable)

# ✅ Hoạt động trên mọi phiên bản
from collections.abc import Callable
def is_function(obj):
    return isinstance(obj, Callable)

Nếu lỗi này xảy ra bên trong một thư viện mà bạn không trực tiếp viết code, hãy thử cập nhật thư viện đó trước. Chạy lệnh này trong terminal của bạn:

pip install --upgrade <package_name>

Tại sao lỗi này xảy ra

Trong gần chín năm, Python đã duy trì các tham chiếu trùng lặp cho Abstract Base Classes (ABCs). Bạn có thể tìm thấy chúng ở cả collectionscollections.abc. Sự dư thừa này nhằm mục đích cho phép các lập trình viên có thời gian chuyển đổi mã nguồn sau khi Python 3.3 ra mắt vào năm 2012.

Thời gian ân hạn đó đã kết thúc với Python 3.10. Bất kỳ thư viện nào chưa được cập nhật kể từ năm 2021 đều có khả năng vấp phải lỗi này. Mặc dù Callable là lỗi phổ biến nhất, bạn cũng có thể gặp lỗi tương tự với Iterable, Mapping, MutableMapping hoặc Sequence.

Sửa mã nguồn của chính bạn

Nếu bạn có quyền truy cập vào mã nguồn, bạn nên cập nhật các import ngay lập tức. Điều này giúp code của bạn bền vững hơn và sạch sẽ hơn.

Tùy chọn 1: Import hiện đại (Cách tốt nhất)

Thay vì import toàn bộ module collections, hãy lấy chính xác những gì bạn cần từ submodule abc.

# Cách cũ:
# import collections
# my_list = isinstance(obj, collections.Sequence)

# Cách mới:
from collections.abc import Sequence
my_list = isinstance(obj, Sequence)

Tùy chọn 2: Hỗ trợ các phiên bản Python rất cũ

Bạn cần hỗ trợ đồng thời Python 2.7 và 3.12? Hãy sử dụng khối try-except để xử lý việc import một cách linh hoạt qua các thế hệ.

try:
    from collections.abc import Callable
except ImportError:
    # Phương án dự phòng cho các phiên bản Python cũ hơn 3.3
    from collections import Callable

Sửa các thư viện bên thứ ba bị lỗi

Bạn sẽ thường thấy lỗi này khi sử dụng các phiên bản cũ của requests, PyYAML hoặc Jinja2. Nếu bạn vừa nâng cấp máy chủ lên Ubuntu 22.04 hoặc macOS Sonoma, các môi trường ảo (virtual environment) cũ của bạn có thể đột ngột bị lỗi.

Bước 1: Tìm nguyên nhân

Kiểm tra traceback trong terminal của bạn. Nó sẽ chỉ đến một tệp cụ thể trong thư mục site-packages. Ví dụ, nếu bạn thấy jinja2/tests.py trong nhật ký lỗi, bạn biết rằng Jinja2 chính là vấn đề.

Bước 2: Cập nhật package

Hầu hết các thư viện phổ biến đã phát hành bản vá từ nhiều năm trước. Hãy cập nhật chúng lên phiên bản mới nhất để giải quyết xung đột:

pip install --upgrade jinja2 PyYAML requests

Bước 3: Giải pháp tạm thời "Monkeypatch"

Đôi khi bạn phải làm việc với một thư viện cũ không còn được bảo trì. Nếu không thể chỉnh sửa mã nguồn của nó, hãy sử dụng "monkeypatch". Thêm đoạn mã này vào ngay đầu tệp main.py hoặc manage.py của bạn, trước bất kỳ lệnh import nào khác.

import collections

# Thủ công thêm lại các thuộc tính bị thiếu
if not hasattr(collections, 'Callable'):
    import collections.abc
    collections.Callable = collections.abc.Callable
    collections.Iterable = collections.abc.Iterable
    collections.Mapping = collections.abc.Mapping
    collections.MutableMapping = collections.abc.MutableMapping
    collections.Sequence = collections.abc.Sequence

Xác minh

Xác minh việc sửa lỗi bằng cách chạy một lệnh nhanh sau đây. Nó sẽ in ra "Success" mà không có lỗi nào:

python3 -c "from collections.abc import Callable; print('Success')"

Nếu bạn đã sử dụng monkeypatch, hãy khởi động lại ứng dụng. Lỗi AttributeError sẽ biến mất, cho phép ứng dụng của bạn khởi động bình thường trên Python 3.10 hoặc mới hơn.

Tài liệu tham khảo thêm

Related Error Notes