2014-09-25 73 views
0

主題是包裝的產品進口和__init__文件: 存在這樣說隱藏真正的模塊

這些文件有助於防止與通用名目錄從 規範一個報價無意中在以後出現真正的模塊在模塊 搜索路徑。沒有這種保護措施,Python可能會選擇一個與您的代碼無關的目錄 ,僅僅因爲它在搜索路徑的早期目錄中出現嵌套 。

你能舉這個例子嗎?

回答

1

目前Python documentation沒有這樣的報價。

PEP 420 Implicit Namespace Packages (Python 3.3+) specifies

  • 如果<directory>/foo/__init__.py發現,一個普通包導入並返回。
  • 如果不是,但找到了<directory>/foo.{py,pyc,so,pyd},則會導入並返回一個模塊。確切的擴展列表因平臺而異,並且是否指定了-O標誌。這裏的列表是有代表性的。
  • 如果不是,但找到<directory>/foo並且它是一個目錄,它將被記錄下來並繼續掃描父路徑中的下一個目錄。
  • 否則,掃描繼續執行父路徑中的下一個目錄。

即如果<directory>sys.path然後import foo可能對應於<directory>/foo即使沒有<directory>/foo/__init__.py。因此,可以接受這個概念,因爲與命名空間包的好處相比,由於偶然的成功而可能造成混淆的風險被認爲太小。

除非你打算提供一個名稱空間包,例如,爲了讓插件模塊能夠將它們放入不同的目錄(可以作爲不同的OS包安裝),那麼你應該總是爲你的Python包提供__init__.py - 顯式比隱式。

+0

我嘗試@Martijn的例子,事實上,即使沒有任何__init__.py文件,導致「images」目錄被導入,只是因爲它在搜索路徑的前面找到。我認爲只有包含__init__的目錄.py文件被導入。 – tt0686 2014-09-25 13:46:47

+1

@ tt0686:是的,如果'sys.path'中沒有'images/__ init __。py'或'images。{py,pyc,...}',那麼'images'目錄會導致'import images'成功:*「如果''在'sys.path'中,那麼'import foo'可能對應於'/foo',即使沒有' /foo/__init__.py'"* – jfs 2014-09-25 13:49:26

+0

但是,導入沒有任何陳述或方法的東西?只是一個目錄? – tt0686 2014-09-25 13:51:43

1

如果允許任何目錄被視爲一個包,然後嘗試導入的存在既作爲目錄作爲搜索路徑上的模塊可以挑選的目錄在模塊的模塊。

假設您有images目錄images.py模塊。如果在搜索路徑中較早找到它,import images將找到images目錄。

通過要求__init__.py來標記包,可以將這些數據目錄包含在Python代碼旁邊,而不必擔心會掩蓋具有相同名稱的真正模塊。