包相對導入的陷阱:混合使用,相比於Python 2.X的隱式包相對導入,以及Python 2.X和3.X中的顯式包相對導入點號語法,有些時候從 sys.path上壹個路徑出發的絕對包導入會是更推薦的選擇。這壹問題可能看上去難以理解,但是當妳開始編寫自己的包,可能就會變得更加重要了。 如前所述,Python 3.X的相對導入語法和默認絕對導入搜索規則,讓包內導入變得顯式從而使其更容易被註意和被維護,而且允許妳在壹些命名沖突的情況下顯式地進行選擇。然而,妳也必須註意到該模型帶來的下面兩個結果:在Python 3.X和2.X中,包相對導入語句的使用會隱式地將壹個文件與壹個包目錄的角色進行綁定,並禁止該文件通過其他方式被使用。在Python 3.X中,新的相對導入搜索規則改變意味著壹個文件不能像在2.X中那樣同時扮演腳本和包模塊的角色。這些約束的理由有些微妙,不過由於下面的兩條同時成立:Python 3.X和2.X不允許隨意使用from .的相對導入語法,除非發起導入的文件本身作為包的壹部分(即該文件在其他地方被導入)。Python 3.X的導入不會搜索壹個包模塊自身的路徑,除非使用了from .的相對導入語法(或該模塊位於當前工作路徑、頂層腳本的主目錄下)。使用相對導入會阻止妳在2.X和3.X中創建同時扮演可執行程序和外部可導入包角色的目錄項。此外,壹些文件在3.X中不能像在2.X中那樣同時扮演腳本和包模塊的角色。就導人語句來說,這些規則可以歸結為下面的兩行代碼的形式:前壹行在Python 2.X和3.X中都只用於包模式,而後壹行在3.X中只用於程序模式。
最終的效果是不論2.X還是3.X中的文件,妳都應該只選擇壹種使用模式,即包模式(使用相對導入)或程序模式(使用簡單導入),並將真正的包模塊文件單獨放到壹個子目錄中,與頂層腳本文件隔離開來。
另壹方面,妳可以嘗試手動改變sys.path(通常是壹項脆弱並易出錯的任務)或總是通過絕對導入使用完整的包路徑,並且假定包的根目錄位於模塊搜索路徑上,來替代包相對導入語法或簡單導入。