Tôi nên tổ chức dự án Python của mình như thế nào?

Khi bắt đầu một dự án Python mới, bạn có thể muốn mở một trình soạn thảo mã và bắt đầu viết một số mã. Đây là tất cả tốt và tốt nếu bạn chỉ đang thử nghiệm một cái gì đó. Nhưng lý tưởng nhất là nếu bạn muốn mã của mình giải quyết một số nhu cầu cụ thể, thì bạn sẽ muốn cấu trúc dự án của mình cho phù hợp

Cái này cho ai?

Bài đăng này một phần lấy cảm hứng từ bài viết của Guilherme Latrova, Sắp xếp mã Python như một CHUYÊN NGHIỆP. Nếu bạn mới bắt đầu với Python hoặc nếu bạn đã làm việc với nó được một thời gian và muốn hiểu rõ hơn về cách tổ chức các dự án của mình, hãy tự giúp mình và đọc nó

Bài đăng này chủ yếu được viết để nhắc nhở bản thân tôi về các bước cần thực hiện khi bắt đầu một dự án, vì tôi chắc chắn sẽ quên điều gì đó trong quá trình thực hiện

Trong trường hợp bạn đang ở đây, tôi cũng sẽ cố gắng thêm một số ngữ cảnh hóa nếu điều đó hữu ích

Giữ nó có tổ chức

Bất kể bạn đang mã hóa cái gì, bạn sẽ có thời gian tốt hơn nếu bạn sắp xếp mọi thứ ngăn nắp. Đối với tôi, điều này thường có nghĩa là có cấu trúc tệp ngăn cách các khía cạnh khác nhau trong mã của tôi

Điều này thường có nghĩa là tôi có một tệp "chính", đối với tất cả ý định và mục đích, có chức năng như một mục lục cho phần còn lại của mã của tôi

Sau đó, tôi cố gắng sắp xếp mã của mình thành các mô-đun riêng biệt

Các mô-đun Python có thể được nhập bởi các tệp

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
7 khác và đó là nơi tôi giữ các đoạn mã riêng biệt, có liên quan

[Để có lời giải thích ngắn gọn, hay về những gì tạo nên tập lệnh/mô-đun Python, hãy xem bài viết của Trey Hunter, Mô-đun so với Tập lệnh trong Python]

Cấu trúc

Như một điểm khởi đầu, đây là cấu trúc dự án điển hình của tôi có thể trông như thế nào khi tôi bắt đầu mọi thứ

project_root/
┣ .venv/                        # virtual environment
┣ app/
┃ ┣ core/                       # base app logic
┃ ┃ ┣ config.py
┃ ┃ ┣ exceptions.py
┃ ┃ ┣ log_config.py
┃ ┃ ┗ __init__.py
┃ ┣ util/                       # app specific tasks
┃ ┃ ┣ do_thing.py
┃ ┃ ┣ do_other_thing.py
┃ ┃ ┗ __init__.py
┃ ┣ main.py                     # entry point to application
┃ ┗ __init__.py
┣ tests/                        # tests live outside application
┣ .gitignore
┗ README.md

Đôi khi, một tổ bổ sung bên trong thư mục

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
8 có thể hợp lý, tùy thuộc vào những gì bạn đang cố gắng thực hiện

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md

Vì vậy, làm thế nào để cấu trúc dự án của bạn giúp bạn trong thời gian dài?

Gốc dự án

Bạn có thể đặt tên cho thư mục

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
9 của mình bất cứ điều gì bạn muốn. Nhưng đây là nơi mọi thứ liên quan đến dự án của bạn sẽ tồn tại

Có thể rất hấp dẫn khi chỉ bắt đầu tạo một loạt các tệp

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
7, sau đó liên kết tất cả chúng lại với nhau theo một số cách như mì spaghetti

Và nếu điều đó hiệu quả với bạn, tôi là ai để cản đường bạn?

Đối với tôi, tôi muốn sắp xếp hợp lý lượng thời gian tôi cần để mở dự án của mình, làm quen với cái gì là cái gì và bắt đầu thực hiện một số mã hóa thực tế.

Điều này gần như là không thể khi tôi không dành thời gian cho những tác phẩm khác

ĐỌC

Bằng cách xem cấu trúc tệp dự án này, ít nhiều bạn sẽ biết điều gì sẽ xảy ra khi bạn mở bất kỳ tệp

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
7 nào

Nhưng rất có thể, nếu bạn đã dành một khoảng thời gian đáng kể cho mã của mình, bạn có thể mất một chút thời gian để nhớ cái gì là cái gì.

Đó là lý do tại sao tôi thực sự khuyên bạn nên tạo tệp

python -m app.main
2. Ngay cả khi bạn không có ý định cho bất kỳ ai khác ngoài bản thân mình nhìn thấy gói hàng nhỏ của mình, nó sẽ giúp bạn tiết kiệm rất nhiều thời gian trong quá trình thực hiện

Nội dung ít nhiều sẽ nhắc nhở bạn rằng bạn đang cố gắng đạt được điều gì và làm thế nào để đạt được điều đó

Ngay cả khi đó là lời nhắc của một lệnh như

python -m app.main

gitignore

Nếu bạn chưa quen với việc viết mã, có thể Git sẽ đe dọa bạn. Tôi không ở đây để làm sáng tỏ toàn bộ sự việc, nhưng tôi chắc chắn sẽ khuyến khích bạn đón nhận nó

Ngay cả khi bạn không viết mã với người khác, một lợi thế lớn của việc sử dụng git sẽ là khả năng khôi phục mọi thứ nếu có sự cố xảy ra

Ngoài ra, nếu bạn có thứ gì đó hoạt động [ví dụ: trong "sản xuất"], thì thật tuyệt khi có phiên bản "phát triển", biết rõ rằng bạn không làm hỏng công việc bạn đã hoàn thành

Điều này sẽ làm cho cuộc sống của bạn dễ dàng hơn

Vì lý do đó, một trong những điều đầu tiên tôi làm trong dự án của mình là tạo một tệp

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
0. Tất cả điều này làm là nó cho Git biết những tệp/thư mục nào cần bỏ qua

tôi sử dụng. plugin Trình tạo gitignore cho VSCode, nhưng có rất nhiều công cụ trợ giúp việc này

Tôi biết điều đó hơi khó chịu, nhưng dành một chút thời gian để làm quen với Git sẽ có kết quả lâu dài

Môi trường ảo

Tôi đã viết ngắn gọn về điều này trước đây, nhưng tôi muốn nhắc lại ở đây. Trong hầu hết mọi trường hợp, bạn muốn đảm bảo rằng bạn đã tạo một môi trường ảo cho dự án của mình

Sử dụng

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
1 [hoặc
project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
2 nếu bạn đang sử dụng máy Mac] sẽ thực hiện thủ thuật

Hãy nhớ rằng, nếu bạn đang ở trong thiết bị đầu cuối, điều này sẽ tạo thư mục

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
3 trong thư mục làm việc hiện tại của bạn, vì vậy hãy đảm bảo rằng bạn đang ở trong ____19 của mình khi thực hiện việc này

Tạo ra một môi trường ảo là một chuyện, nhưng nó sẽ chẳng ích gì nếu bạn không kích hoạt nó

Tôi có thể dành nhiều thời gian hơn để nói về lý do tại sao điều này lại quan trọng, nhưng điều đó có thể phải chờ một bài viết khác

Khi bạn đã kích hoạt môi trường ảo của mình, thì bạn có thể bắt đầu cài đặt bất kỳ gói nào bạn có thể cần trong dự án của mình

Tôi muốn nói về sự phụ thuộc vào một ngày nào đó, nhưng bây giờ, tôi sẽ liên kết với tài nguyên tuyệt vời này của James Bennett, Boring Python. quản lý phụ thuộc

Nó có thể nặng nếu bạn mới bắt đầu, nhưng vẫn đáng để đánh dấu trang, nếu không có gì khác

chủ yếu. py

Trong thư mục

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
5 của bạn, bạn nên có một
project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
6 và
project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
7, cái sau làm cho
project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
5 trở thành một "gói. "

Như tôi đã đề cập ở trên,

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
6 ít nhiều sẽ vạch ra ứng dụng của bạn đang làm gì

Tôi sẽ cố gắng làm cho mã dễ đọc nhất có thể. Để lại tất cả logic và công việc nặng nhọc cho các mô-đun khác trong ứng dụng của bạn

Ví dụ: đây là phiên bản hơi cô đọng của

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
6 mà tôi sử dụng cho trang web này

project_root/                    
┣ src/
┃ ┣ app/    
┃ ┃ ┣ core/                    
┃ ┃ ┣ util/                       
┃ ┃ ┣ main.py                    
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
3

Những gì bạn sẽ lưu ý là rất nhiều công việc nặng nhọc của ứng dụng đang diễn ra ở nơi khác. Nhưng điều này cho bạn biết điều gì đang xảy ra khi ứng dụng khởi động

Như bạn có thể tưởng tượng, cấu trúc ứng dụng được chia nhỏ hơn nữa theo mối quan tâm. Ví dụ: nếu có sự cố xảy ra với kết nối cơ sở dữ liệu của tôi, tôi có thể bắt đầu tìm trong thư mục

python -m app.main
1 của mình theo bản năng

Cốt lõi

Vì vậy, những gì đối phó với thư mục

python -m app.main
2 này?

Đối với tôi, nó cung cấp một vị trí cho các mô-đun đóng vai trò là khung cho ứng dụng của tôi. Điều này thường có nghĩa là cấu hình, ghi nhật ký và ngoại lệ tùy chỉnh

Mỗi thứ trong số này đều cực kỳ hữu ích cho bất kỳ ứng dụng nào, nhưng bạn có thể thấy rằng bạn không cần bất kỳ thứ nào trong số chúng

Tuy nhiên, tôi cho rằng việc có ngay cả một tệp cấu hình đơn giản cũng có thể đáng giá, nếu chỉ để giúp bạn linh hoạt mở rộng quy mô chương trình nhỏ của mình

Chắc chắn, nó có thể chỉ là một dự án thú vị nào đó, nhưng nó cũng có thể phát triển thành thứ mà bạn không mong đợi, vậy tại sao lại giới hạn bản thân?

Tôi cũng sẽ lập luận rằng ghi nhật ký là một công cụ tuyệt vời không nên bỏ qua khi phát triển

sử dụng

Tại thời điểm này, bạn có thể hiểu tôi đang đi đâu với điều này. Bạn có thể thấy rằng

python -m app.main
3 quá rộng và không đủ cụ thể. Đây có lẽ là một bản năng tốt

Tại thời điểm này, bạn có thể bắt đầu nghĩ về những gì bạn đang cố gắng đạt được với chương trình nhỏ của mình.

Bạn có thể tìm thấy rất nhiều bài viết về các mô hình thiết kế khác nhau và có lẽ tất cả chúng đều có giá trị.

Nhưng nếu bạn thấy mình dành quá nhiều thời gian để suy nghĩ về một mô hình mà không thực sự viết mã, thì có lẽ bạn đang làm sai.

Ý tưởng là để giảm độ phức tạp mà bạn thấy khi mở dự án của mình và giảm thời gian viết mã của bạn

bài kiểm tra

Đây là một phần quá ngắn cho bạn biết rằng bạn phải luôn có kế hoạch kiểm tra mã của mình. Tất cả những gì tôi sẽ nói là, trái với những gì bạn có thể nghĩ, thử nghiệm thực sự sẽ tăng tốc thời gian phát triển của bạn

Trừ khi bạn có thể viết mã hoạt động hoàn hảo ngay lần đầu tiên, thử nghiệm sẽ cung cấp cho bạn phản hồi ngay lập tức khi bạn thực hiện các thay đổi đối với mã của mình

Đổi lại, điều này sẽ làm giảm sự thất vọng mà bạn có thể cảm thấy khi một đoạn mã phá vỡ một thứ khác

Phần kết luận

Bài đăng này bắt đầu với một mục đích hơi khác. Tôi muốn chạm vào nhiều thứ khác nhau, nhưng bài đăng này đã hơi dài

Cuối cùng, tôi hy vọng nó sẽ giúp nắm bắt được một quá trình dễ dàng chấp nhận. Các nhà phát triển có kinh nghiệm có thể có các quy trình phức tạp và hợp lý hơn để bắt đầu với các dự án của họ

Nhưng đối với tôi, ngay cả bây giờ, mỗi khi tôi bắt đầu một dự án mới, tôi cần nhắc nhở bản thân về những "phương pháp hay nhất" của chính mình để giảm thiểu lượng thời gian tôi dành cho việc "suy nghĩ" về những gì tôi đang cố gắng hoàn thành.

Cách tốt nhất để tổ chức một dự án Python là gì?

Cho dù bạn đang thực hiện dự án của riêng mình hay cộng tác với những người khác, có 3 mẹo đơn giản giúp bạn sắp xếp không gian ngăn nắp. .
Mẹo số 1. Tạo môi trường ảo
Mẹo số 2. Tạo một thư mục riêng cho các bài kiểm tra
Mẹo số 3. Tạo các thư mục nội dung khác nhau

Tôi nên tổ chức mã Python của mình như thế nào?

Các mô-đun là các tệp có “. py” chứa mã Python. Chúng giúp tổ chức các chức năng, lớp hoặc bất kỳ khối mã nào có liên quan trong cùng một tệp. Đây được coi là phương pháp hay nhất để chia các khối mã Python lớn thành các mô-đun chứa tối đa 300–400 dòng mã .

Tôi nên lưu trữ các dự án Python ở đâu?

Tạo thư mục có tên PythonPrograms trên C của bạn. \ drive . Bạn sẽ lưu trữ tất cả các chương trình Python của mình trong thư mục này.

Ba cách mà chúng tôi tổ chức mã trong Python là gì?

🌳 Cấu trúc dự án Python của bạn. Trước tiên, hãy tập trung vào cấu trúc thư mục, đặt tên tệp và tổ chức mô-đun .

Chủ Đề