主題是包裝的產品進口和__init__
文件: 存在這樣說隱藏真正的模塊
這些文件有助於防止與通用名目錄從 規範一個報價無意中在以後出現真正的模塊在模塊 搜索路徑。沒有這種保護措施,Python可能會選擇一個與您的代碼無關的目錄 ,僅僅因爲它在搜索路徑的早期目錄中出現嵌套 。
你能舉這個例子嗎?
主題是包裝的產品進口和__init__
文件: 存在這樣說隱藏真正的模塊
這些文件有助於防止與通用名目錄從 規範一個報價無意中在以後出現真正的模塊在模塊 搜索路徑。沒有這種保護措施,Python可能會選擇一個與您的代碼無關的目錄 ,僅僅因爲它在搜索路徑的早期目錄中出現嵌套 。
你能舉這個例子嗎?
目前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
- 顯式比隱式。
如果允許任何目錄被視爲一個包,然後嘗試導入的存在既作爲目錄和作爲搜索路徑上的模塊可以挑選的目錄在模塊的模塊。
假設您有images
目錄和和images.py
模塊。如果在搜索路徑中較早找到它,import images
將找到images
目錄。
通過要求__init__.py
來標記包,可以將這些數據目錄包含在Python代碼旁邊,而不必擔心會掩蓋具有相同名稱的真正模塊。
我嘗試@Martijn的例子,事實上,即使沒有任何__init__.py文件,導致「images」目錄被導入,只是因爲它在搜索路徑的前面找到。我認爲只有包含__init__的目錄.py文件被導入。 – tt0686 2014-09-25 13:46:47
@ 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
但是,導入沒有任何陳述或方法的東西?只是一個目錄? – tt0686 2014-09-25 13:51:43