簡體   English   中英

在 Python 3 中管理命名空間的正確方法是什么?

[英]What is the right way to manage namespaces in Python 3?

我的大部分編程背景是 C++ 和 Java,但出於專業原因,我開始學習 Python。 我注意到的第一件事是 Python 的包和命名空間的新方法,但在谷歌搜索一段時間並做了一些實驗后,我認為我開始掌握它的竅門。

然后我讀了這個,這表明我剛剛學到的一切都是錯誤的。 所以現在我又困惑了,我無法弄清楚我應該如何組織我的代碼。


這是一個非常具體的問題,我真的不知道如何正確回答任何版本的 Python,特別是我不知道答案是否從 Python 2 更改為 3。假設我想要一個克隆的 github 中的類回購,存儲在:

/Users/me/my_teams_code/some_project/package/IWantThisClass.py

但是假設我在這里還有其他一些項目:

/Users/me/my_own_code/some_other_project1/...
/Users/me/my_own_code/some_other_project2/...
/Users/me/my_own_code/some_other_project3/...

每個都使用 IWantThisClass。 一種策略似乎是每次都手動將正確的目錄添加到 sys.path ,但這相當麻煩 - 特別是當我只是在 Jupyter notebook 中進行試驗時。 我在谷歌搜索后確定的解決方案是在 bash 中將包目錄添加到我的 PYTHONPATH 變量中; 這在“導入 IWantThisClass”的意義上工作得很好。 但我在上面 Coghlan 的帖子中讀到:

“下一個陷阱存在於所有當前版本的 Python 中,包括 3.3,並且可以總結為以下一般准則:'永遠不要將包目錄或包內的任何目錄直接添加到 Python 路徑'。”

那么解決這個問題的“正確”方法是什么?

基本上,如果package是您的包的頂級目錄,您應該將包含package的目錄添加到sys.path 如果您要導入的不是包而是單個模塊(即,只是不在包目錄中的單個.py文件),則該模塊應位於sys.path / 目錄中

究竟應該如何添加這些路徑是另一個問題。 對於我想向路徑添加一次性內容的情況,我發現最簡單的方法是在“站點目錄”中創建一個.PTH文件——無論是主站點包目錄還是用戶——特定的站點包目錄。 在該.PTH文件中,您可以列出其他目錄,然后將這些目錄添加到site.path 因此,您可以擁有自己的my_stuff.pth小文件,該文件使用您需要的目錄設置sys.path 這避免了必須向每個腳本添加樣板代碼以手動修改sys.path 您可以在site模塊的文檔中閱讀有關如何執行此操作的信息。

另一個可能更好的答案是,您應該盡量避免將特定目錄添加到sys.path以訪問特定文件。 相反,您應該嘗試安裝相關的包,這會讓 Python 為您設置路徑。 如果您正在使用不希望弄亂主站點包的python setup.py develop包,您可以使用python setup.py developpip install --editable來“就地”安裝包。 (也就是說,包文件將保持.PTH ,不會移動到全局 Python 站點包中,安裝程序將更新相應的.PTH文件,以便新安裝的包可以導入。)

簡而言之,最終您需要從“這個文件想要這個其他文件中的這個類”的角度來查看它。 您應該關注的單元是可安裝的包或模塊。 如果你正在編寫需要 SomeClass 的代碼,你應該安裝提供 SomeClass 的包/模塊,然后導入它; 不要試圖在不安裝包的情況下臨時操作sys.path來定位您想要的單個文件/類。 (如前所述, setup.py developpip install --editable允許您執行此操作,同時仍將實際文件保留在您想要的位置。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM