簡體   English   中英

我應該使用“import os.path”還是“import os”?

[英]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 程序員早期對模塊和包以及代碼組織感到困惑。 這真的有兩個原因

  1. 如果您將os視為一個包,並且知道您可以執行import os並可以訪問子模塊os.path ,那么當您無法執行import twisted並在不導入的情況下自動訪問twisted.spread時,您可能會感到驚訝。

  2. 令人困惑的是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

以供參考:

找不到任何明確的參考,但我看到os.walk的示例代碼使用 os.path 但只導入 os

我同意麥克

我認為

import os很好。

您剛才必須提到這樣的細節

os.path()

或者如果您正在調用模塊中的模塊

os.path.exists()

暫無
暫無

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

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