![](/img/trans.png)
[英]pybind11: How to organize pybind module under a namespace package
[英]How to properly organize a package/module dependency tree?
早上好,
我目前正在編寫python庫。 目前,模塊和類是以無組織的方式部署的,沒有合理的設計。 當我接近正式發布時,我想重新組織類和模塊,以便它們具有更好的總體設計。 我繪制了導入依賴關系圖,並計划按層級別聚合類。 另外,我正在考慮對類進行一些修改,以減少這些依賴性。
對於潛在復雜且正在制作中的python庫進行總體設計的最佳策略是什么? 您有有趣的建議嗎?
謝謝
更新:
我確實在尋找經驗法則。 例如,假設發生這種情況(為清楚起見刪除了init .py)
foo/bar/a.py
foo/bar/b.py
foo/hello/c.py
foo/hello/d.py
現在,如果您碰巧有d.py導入bar.b和a.py導入hello.c,我認為這是一個糟糕的設置。 另一種情況是
foo/bar/a.py
foo/bar/baz/b.py
foo/bar/baz/c.py
假設a.py和b.py都導入c。 您有以下三種解決方案:1)b導入c,導入baz.c 2)您在foo / bar中移動c。 a.py導入c,b.py導入.c 3)將c移動到其他位置(例如foo / cpackage / c.py),然后a和b都導入cpackage.c
我傾向於3),但是如果c.py作為獨立模塊沒有任何意義,例如,因為您要將其“私有”保留在bar包中,則我會優先使用1)。
還有許多其他類似的情況。 我的經驗法則是盡量減少依賴性和交叉的數量,以防止出現高度分支,高度交錯的設置,但我可能是錯的。
“我繪制了導入依賴關系圖,並計划按層級別聚合類。”
Python必須像英語(或其他自然語言)一樣閱讀。
導入是一流的語句,應具有真實含義。 按“層次”(無論是什么層次)組織事物應該是清晰,有意義和顯而易見的。
不要將類的任意技術分組歸入模塊,而將模塊歸入包。
使模塊和包顯而易見且合乎邏輯,以便導入列表顯而易見,簡單且合乎邏輯。
“此外,我正在考慮對類進行一些修改,以減少這些依賴性。”
減少依賴關系聽起來是技術性和任意性的。 可能不是,但是聽起來是這樣。 沒有實際的例子,這是不可能的。
您的目標是清晰。
而且,模塊和包是獨立的重用單元。 (不是類;是類,但是它本身通常是不可重用的。)您的依賴關系樹應該反映出這一點。 您的目標是可以整潔干凈地導入應用程序的模塊。
如果您有許多密切相關的模塊(或替代實現),則可以使用軟件包,但要謹慎使用。 Python庫相對扁平; 這有一些智慧。
編輯
層之間的單向依賴是一項基本功能。 這更多的是關於適當的軟件設計,而不是Python。 您應該(1)在各層中進行設計,(2)在設計時要使各層之間的依賴性非常嚴格,然后(3)在Python中實現。
這些包可能不一定完全適合您的分層。 這些軟件包實際上可以是目錄的平面列表,其依賴性僅通過import
語句表示。
這個問題很模糊。
您可以通過使基本/核心內容從庫的其余部分中不導入任何內容,並從此處導入具體的實現方式來實現此目的。 除了“在導入時沒有彼此導入的兩個模塊”之外,您應該沒問題。
module1.py:
import module2
module2.py:
import module1
這行不通!
這取決於項目,對嗎? 例如,如果您使用的是模型視圖控制器設計,那么您的程序包將以使三組代碼獨立的方式進行結構化。
如果您需要一些想法,請打開site-packages目錄,並查看這些模塊中的一些代碼以了解如何設置它們。
如果不了解該模塊,就沒有正確的方法。 正如阿里所說,這是一個模糊的問題。 您確實只需要分析自己面前的東西,然后找出可能會更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.