Skip to content

Cấu trúc project

Khi sao chép một dự án Python về máy cá nhân, thành viên mới thường mất hàng giờ để gỡ lỗi xung đột phiên bản thư viện hoặc không thể tìm thấy nơi lưu trữ logic tính toán cốt lõi. Làm sao để đảm bảo dự án có thể tái lập tức thì trên bất kỳ thiết bị nào và cấu trúc mã nguồn luôn rõ ràng cho người mới nắm bắt trong vài phút?

Bài viết này chuẩn hóa cấu trúc dự án Python: từ việc quản lý môi trường ảo bằng công cụ chuyên dụng, phân tách vai trò giữa mã nguồn và sổ ghi chép, đến việc tổ chức cây thư mục theo mã số thứ tự.

1. Bảng thuật ngữ cục bộ

Thuật ngữTên tiếng AnhDịch nghĩa & Giải thích
UVUV Package ManagerTrình quản lý môi trường, gói Python.
VirtualenvVirtual EnvironmentMôi trường ảo cô lập của Python.
LockfileDependency LockfileTệp tin khóa cứng phiên bản thư viện.

2. Các khái niệm cốt lõi

2.1 Quản lý môi trường ảo bằng uv

  • ⚙️ Cơ chế: Sử dụng công cụ uv để tạo môi trường ảo cô lập, quản lý các gói phụ thuộc qua tệp pyproject.toml và khóa cứng phiên bản bằng tệp uv.lock.
  • 🔍 Cách nhận diện: Sự hiện diện của tệp pyproject.tomluv.lock trong thư mục gốc, các lệnh chạy python được thực hiện qua tiền tố uv run.
  • 💡 Ý nghĩa: Đảm bảo tính nhất quán tuyệt đối về phiên bản thư viện giữa môi trường phát triển cục bộ và môi trường chạy thật.
  • ⚠️ Bẫy: Sử dụng pip install trực tiếp vào môi trường hệ thống, hoặc chỉnh sửa thủ công danh sách thư viện trong tệp yêu cầu mà không thông qua uv lock.

2.2 Phân tách lớp mã nguồn

  • ⚙️ Cơ chế: Tổ chức toàn bộ logic tính toán cốt lõi trong thư mục src/ dưới dạng các tệp tin .py có kiểm thử, chỉ sử dụng Jupyter notebook (.ipynb) cho mục đích vẽ biểu đồ hoặc khám phá nhanh dữ liệu thô.
  • 🔍 Cách nhận diện: Logic xử lý nặng nằm ngoài notebook, thư mục tests/ chứa các kiểm thử đơn vị cho các hàm xử lý dữ liệu và thời gian.
  • 💡 Ý nghĩa: Tăng tính tái sử dụng của mã nguồn, cho phép tự động hóa kiểm thử và tích hợp liên tục.
  • ⚠️ Bẫy: Lưu trữ các logic nghiệp vụ phức tạp hoặc cấu hình cứng trực tiếp bên trong các ô lệnh của Jupyter notebook.

2.3 Tổ chức thư mục theo mã số thứ tự

  • ⚙️ Cơ chế: Đặt tên các thư mục nội dung chính với tiền tố số ba chữ số để định hình dòng chảy dữ liệu, đồng thời sử dụng dấu gạch dưới ở đầu tên cho các thư mục hạ tầng để đẩy chúng lên trên.
  • 🔍 Cách nhận diện: Cây thư mục có dạng 100_data/, 200_features/, _infra/, _tasks/.
  • 💡 Ý nghĩa: Giúp người đọc dễ dàng hình dung dòng chảy của dự án và nhanh chóng định vị tệp tin cần tìm.
  • ⚠️ Bẫy: Trộn lẫn dữ liệu thô, mã nguồn chiến lược và các báo cáo kết quả vào chung một thư mục không có cấu trúc.

✅ Tự kiểm nhanh

  1. Tại sao toàn bộ logic tính toán cốt lõi phải được chuyển từ Jupyter notebook sang tệp .py trong thư mục src/?
Đáp án

Để mã nguồn có thể tái sử dụng ở nhiều nơi khác nhau, dễ dàng thực hiện kiểm thử đơn vị (unit test), quản lý phiên bản chi tiết hơn qua Git, và tránh tình trạng code chạy phụ thuộc vào thứ tự thực thi thủ công của các ô lệnh trong notebook.

  1. Vai trò của tệp uv.lock trong dự án là gì?
Đáp án

Khóa cứng phiên bản chính xác của tất cả các thư viện và các gói phụ thuộc đi kèm, đảm bảo khi bất kỳ thành viên nào chạy lệnh uv sync cũng sẽ dựng lại được một môi trường ảo hoàn toàn giống nhau.