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ệnproject_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ạiCó 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ì spaghettiVà 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àoNhư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ệnNộ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ỏ quatô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ậtHã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àyTạ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àyproject_root/
┣ src/
┃ ┣ app/
┃ ┃ ┣ core/
┃ ┃ ┣ util/
┃ ┃ ┣ main.py
┃ ┃ ┗ __init__.py
┃ ┗ tests/
┣ .gitignore
┗ README.md
3Nhữ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ăngCố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ốtTạ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.