2014-03-27 51 views
10

我是Python新手。我正在開發一個小項目。我需要遵循從病房入手的編碼標準。如何以正確的方式使用import聲明。現在我正在使用Python 2.7。如果我轉向3.x,是否存在與絕對進口產品的衝突?絕對進口和相對進口有什麼區別?python中的絕對導入是什麼?

+0

您能否澄清一下絕對和相對進口是什麼? –

+4

@ Ol'Reliable它們在[PEP 328](http://legacy.python.org/dev/peps/pep-0328/)中有描述。 –

回答

18

這裏繪製的absoluterelative之間的區別與我們討論絕對和相對文件路徑甚至URL的方式非常相似。

絕對{進口,路徑,URL}告訴你究竟通常如何通過指定每一個部分,讓你在以後的事:

import os, sys 
from datetime import datetime 
from my_package.module import some_function 

相對{進口,路徑,網址}是完全他們說他們是:他們相對到他們當前的位置。也就是說,如果目錄結構發生變化或文件移動,這些可能會中斷(因爲它們不再是指同一事物)。

from .module_in_same_dir import some_function 
from ..module_in_parent_dir import other_function 

因此,對於將被共享的代碼,首選絕對導入。


有人問我,在註釋中提供如何from __future__ import absolute_import關係到這一點,它是怎樣來使用的例子。在試圖制定這個例子時,我意識到我無法完全解釋它的行爲,所以我asked a new questionThis answer給出了一個代碼示例,顯示from __future__ import absolute_import的正確工作實現,它實際上解決了歧義。

The accepted answer更詳細地介紹了它爲什麼會如此工作,包括討論Python 2.5更改日誌中令人困惑的措辭。本質上,這個指令的範圍(以及Python的絕對導入和相對導入的區別)非常非常狹窄。如果您發現自己需要這些區別來使代碼正常工作,那麼如果可能的話,您最好重新命名本地模塊。

+0

這就是我的想法。但是,如果是這樣的話,爲什麼當我從'__future__ import(absolute_import)'有''的時候,後一種形式的導入仍然有效? – orome

+2

@raxacoricofallapatorius假設你有一個名爲'string'的本地模塊。你打開一個解釋器併發出'import string'。 Python 2.5會給你本地模塊。 Python 2.7+會給你[string](https://docs.python.org/2/library/string.html)庫。未來的指令將Python 2.5轉換爲2.7的默認行爲。虛線形式是明確相對的,因此標準庫不存在模糊性。因此,他們總是工作一樣。 [更多](https://docs.python.org/2.5/whatsnew/pep-328.html) –

+0

啊我看到'from __future__ absolute_import'禁止*隱式*相對導入(顯式的很好)。正確? – orome

相關問題