3 回答

TA貢獻1835條經驗 獲得超7個贊
首先是一些術語:
“腳本”是打算直接執行的 python (.py) 文件 (
python myscript.py
)“模塊”是一個 Python 文件(通常主要包含函數和類定義),旨在由腳本或其他模塊導入。
“包”是一個最終包含模塊和(在 py2 中是必需的,而不是在 py3 中)
__init__.py
文件的目錄。
您可以查看教程以獲取有關模塊和包的更多信息。
基本上,您想要的是以連貫的單元(包/模塊/腳本)組織您的代碼。
對于一個完整的應用程序,您通常會有一個“主”模塊(不必命名為“main.py”——實際上它通常被命名為應用程序本身),它只會導入一些定義(來自 stdlib,來自 3rd部分庫和您自己的模塊),設置內容并運行應用程序的入口點。在您的示例中,這將是“start.py”腳本。
對于剩下的代碼,你想要的是每個模塊具有很強的內聚性(其中定義的函數和類密切相關并一致實現相同的功能)和低耦合(每個模塊盡可能獨立于其他模塊)。從技術上講,您可以在單個模塊中放置盡可能多的函數和類,但是太大的模塊可能會變得難以維護,因此如果在基于高內聚/低耦合的第一次重組后,您會發現自己有 5000+klocs模塊你可能想把它變成一個包含更專業的子模塊的包。
如果您仍然有幾個實用程序函數顯然不適合您的任何模塊,通常的解決方案是將它們放在“utils.py”(或“misc.py”或“helpers.py”等)中模塊。
您絕對要避免的兩件事是:
循環依賴,可以是直接的(模塊 A 依賴于模塊 B,模塊 B 依賴于模塊 A),也可以是間接的(模塊 A 依賴于模塊 B,而模塊 B 又依賴于模塊 A)。如果你發現你有這樣的情況,這意味著你應該將兩個模塊合并在一起或提取一些定義到第三個模塊。
通配符導入(“從模塊導入 *”),這是一個主要的 PITA wrt/可維護性(您無法從導入中得知某些名稱是從哪里導入的)并使代碼容易受到意外 - 有時并不明顯 - 損壞
正如您所看到的,這仍然是一個非常通用的指南,但是不能自動決定哪些屬于一起,最終取決于您自己的判斷。

TA貢獻1770條經驗 獲得超3個贊
pythonic 處理單個文件的方法(我將討論,因為它主要適用于類)是單個文件是一個模塊(不是我之前所說的包)。
許多工具通常存在于單個包中,但單個模塊中的所有工具應始終圍繞一個主題。話雖如此,我通常會將一個非常小的項目保存在一個文件中,其中包含多個函數和幾個類。然后我會使用 if main 來包含腳本,因為我希望它完整地運行。
if __name__== '__main__':
我會盡可能將邏輯分解為函數,以便腳本的主體可以作為更高級別的邏輯可讀。
簡短回答:無法在任何規模上管理每個功能的文件。您應該將東西放在具有相關功能的文件(模塊)中。是否應將當前功能聚集到模塊中取決于您。
添加回答
舉報