Cách sử dụng câu lệnh import trong Python: Từ cơ bản đến nâng cao

Câu lệnh import là nền tảng để tổ chức và tái sử dụng mã trong Python. Nó cho phép bạn kéo các hàm, lớp, hằng số hoặc toàn bộ không gian tên từ các mô-đun khác vào ngữ cảnh hiện tại — một yếu tố then chốt trong việc xây dựng hệ thống phần mềm rõ ràng và dễ bảo trì.

1. Nhập toàn bộ mô-đun

Khi sử dụng import module_name, mọi thành phần trong mô-đun đều được tải vào bộ nhớ, nhưng phải truy cập thông qua tên mô-đun như một không gian tên.

import statistics

data = [4, 8, 15, 16, 23, 42]
avg = statistics.mean(data)
print(f"Giá trị trung bình: {avg}")

2. Nhập chọn lọc với from ... import

Để giảm độ dài cú pháp và tăng tính trực quan cho những thành phần thường dùng, bạn có thể nhập riêng lẻ:

from pathlib import Path
from json import loads, dumps

config_path = Path("config.json")
if config_path.exists():
    with config_path.open() as f:
        config = loads(f.read())

3. Đặt bí danh (alias) cho mô-đun

Bí danh giúp rút gọn tên mô-đun dài hoặc tránh xung đột tên. Đây là quy ước phổ biến trong cộng đồng phát triển:

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(8, 5))
sns.histplot([1, 2, 2, 3, 3, 3, 4], kde=False)
plt.title("Phân bố tần suất")
plt.show()

4. Tránh dùng from module import *

Mặc dù cú pháp này tiện lợi, nó làm mờ nguồn gốc của các tên được sử dụng, gây khó khăn khi gỡ lỗi và kiểm soát phụ thuộc. Thay vào đó, hãy liệt kê tường minh:

# ❌ Không khuyến khích
# from os import *

# ✅ Khuyến khích
from os import path, getenv, makedirs

5. Nhập tương đối trong gói (package)

Trong cấu trúc gói, nhập tương đối giúp duy trì tính độc lập với đường dẫn tuyệt đối. Dấu chấm (.) đại diện cho gói hiện tại:

# myapp/utils/helpers.py
from ..core.validators import validate_email  # lên một cấp rồi vào core.validators

def safe_email_check(email_str):
    return validate_email(email_str) if email_str else False

6. Nhập động với importlib

Khi tên mô-đun chỉ biết ở thời điểm chạy (ví dụ: do người dùng nhập hoặc cấu hình), hãy dùng importlib.import_module():

import importlib

def load_driver(driver_name: str):
    try:
        driver_module = importlib.import_module(f"drivers.{driver_name}")
        return driver_module.initialize()
    except ModuleNotFoundError:
        raise ValueError(f"Trình điều khiển '{driver_name}' không tồn tại")

# Sử dụng
db_conn = load_driver("postgresql")

7. Kiểm soát thứ tự và nhóm import

Theo PEP 8, nên phân nhóm import theo thứ tự: thư viện chuẩn → thư viện bên ngoài → mô-đun nội bộ. Mỗi nhóm cách nhau bởi một dòng trắng:

# Thư viện chuẩn
import logging
from typing import Dict, List, Optional

# Thư viện bên ngoài
import requests
import yaml
from fastapi import HTTPException

# Mô-đun nội bộ
from app.models.user import UserSchema
from app.services.auth import verify_token

8. Xử lý mô-đun tùy chọn

Khi một thư viện không bắt buộc (ví dụ: hỗ trợ xuất PDF chỉ khi cài thêm weasyprint), hãy bao bọc import trong khối try/except:

pdf_generator = None
try:
    from weasyprint import HTML
    pdf_generator = HTML
except ImportError:
    pass  # Bỏ qua nếu không cài đặt

def export_as_pdf(content: str) -> bytes | None:
    if pdf_generator is None:
        return None
    return pdf_generator(string=content).write_pdf()

9. Đường dẫn tìm kiếm mô-đun

Python duyệt các đường dẫn theo thứ tự: thư mục hiện hành → các thư mục trong PYTHONPATH → thư mục cài đặt Python. Bạn có thể kiểm tra bằng:

import sys
for idx, p in enumerate(sys.path, 1):
    print(f"{idx}. {p}")

10. Các vấn đề thường gặp

  • ImportError: Kiểm tra chính tả tên mô-đun, trạng thái cài đặt (pip show package_name), và vị trí file (có nằm trong sys.path không?)
  • Vấn đề import vòng tròn: Di chuyển import vào bên trong hàm hoặc phương thức, hoặc tách logic sang một mô-đun trung gian.
  • Xung đột phiên bản: Dùng venv hoặc poetry để cô lập môi trường; xác minh phiên bản bằng package.__version__ hoặc pip list.

Thẻ: python import modules importlib packaging

Đăng vào ngày 14 tháng 6 lúc 04:31