[英]Should I use `import os.path` or `import os`?
根據官方文檔, os.path
是一個模塊。 因此,導入它的首選方式是什么?
# Should I always import it explicitly?
import os.path
或者...
# Is importing os enough?
import os
請不要回答“導入os
對我有用”。 我知道,它現在也適用於我(從 Python 2.6 開始)。 我想知道的是關於這個問題的任何官方建議。 所以,如果你回答了這個問題,請張貼你的參考資料。
os.path
以一種有趣的方式工作。 看起來os
應該是一個帶有子模塊path
的包,但實際上os
是一個普通的模塊,它使用sys.modules
來注入os.path
。 這是發生的事情:
當 Python 啟動時,它會將一堆模塊加載到sys.modules
。 它們不綁定到腳本中的任何名稱,但是當您以某種方式導入它們時,您可以訪問已經創建的模塊。
sys.modules
是緩存模塊的字典。 當你導入一個模塊時,如果它已經被導入到某個地方,它會獲取存儲在sys.modules
中的實例。 os
是 Python 啟動時加載的模塊之一。 它將其path
屬性分配給特定於操作系統的路徑模塊。
它注入sys.modules['os.path'] = path
以便您能夠執行“ import os.path
”,就好像它是一個子模塊一樣。
我傾向於將os.path
視為我想使用的模塊,而不是os
模塊中的東西,所以即使它不是一個名為os
的包的子模塊,我導入它有點像它是一個,我總是import os.path
。 這與os.path
的記錄方式一致。
順便說一句,我認為這種結構導致許多 Python 程序員早期對模塊和包以及代碼組織感到困惑。 這真的有兩個原因
如果您將os
視為一個包,並且知道您可以執行import os
並可以訪問子模塊os.path
,那么當您無法執行import twisted
並在不導入的情況下自動訪問twisted.spread
時,您可能會感到驚訝。
令人困惑的是os.name
是一個普通的東西,一個字符串,而os.path
是一個模塊。 我總是用空的__init__.py
文件來構建我的包,這樣在同一級別我總是有一種類型的東西:模塊/包或其他東西。 幾個大型 Python 項目采用這種方法,這往往會產生更結構化的代碼。
根據 Tim Peters 的PEP-20 ,“顯式優於隱式”和“可讀性很重要”。 如果你從os
模塊中需要的一切都在os.path
下,那么import os.path
會更明確,讓其他人知道你真正關心的是什么。
同樣,PEP-20 也說“簡單勝於復雜”,因此如果您還需要位於更通用的os
保護傘下的東西,那么import os
將是首選。
確定答案: import os
並使用os.path
。 不要直接import os.path
。
從模塊本身的文檔中:
>>> import os
>>> help(os.path)
...
Instead of importing this module directly, import os and refer to
this module as os.path. The "os.path" name is an alias for this
module on Posix systems; on other systems (e.g. Mac, Windows),
os.path provides the same operations in a manner specific to that
platform, and is an alias to another module (e.g. macpath, ntpath).
...
有趣的是,導入 os.path 將導入所有的 os。 在交互式提示中嘗試以下操作:
import os.path
dir(os)
結果將與您剛剛導入 os. 這是因為 os.path 將根據您擁有的操作系統引用不同的模塊,因此 python 將導入 os 以確定要為路徑加載哪個模塊。
對於某些模塊,說import foo
不會暴露foo.bar
,所以我想這真的取決於特定模塊的設計。
通常,僅導入所需的顯式模塊應該會稍微快一些。 在我的機器上:
import os.path
: 7.54285810068e-06
秒
import os
: 9.21904878972e-06
秒
這些時間足夠接近,可以忽略不計。 您的程序可能現在或以后需要使用os
中的其他模塊,因此通常犧牲兩微秒並使用import os
來避免以后出現此錯誤是有意義的。 我通常支持將 os 作為一個整體導入,但可以理解為什么有些人更喜歡import os.path
以在技術上更高效並向代碼讀者傳達這是os
模塊中唯一需要使用的部分. 它本質上歸結為我心中的一個風格問題。
常識在這里起作用: os
是一個模塊,而os.path
也是一個模塊。 因此,只需導入您要使用的模塊:
如果要使用os
模塊中的功能,請導入os
。
如果要使用os.path
模塊中的功能,請導入os.path
。
如果要在兩個模塊中使用功能,則導入兩個模塊:
import os import os.path
以供參考:
Lib/idlelib/rpc.py使用os
並導入os
。
Lib/idlelib/idle.py使用os.path
並導入os.path
。
Lib/ensurepip/ init .py使用兩者並導入兩者。
找不到任何明確的參考,但我看到os.walk的示例代碼使用 os.path 但只導入 os
我同意麥克
我認為
import os
很好。
您剛才必須提到這樣的細節
os.path()
或者如果您正在調用模塊中的模塊
os.path.exists()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.