1. 程式人生 > >絕對匯入與相對匯入、__future__模組的absolute_import、division和print_function

絕對匯入與相對匯入、__future__模組的absolute_import、division和print_function

絕對匯入與相對匯入:

相對匯入:

relative import也叫作相對引入,在Python2.5及之前是預設的引入方法。

類似上面的寫法就是相對匯入。這種引入方式使用一個點號來標識引入類庫的精確位置。與linux的相對路徑表示相似,一個點表示當前目錄,每多一個點號則代表向上一層目錄

如:

這個例子用from .foo import a即從foo.py的上一級目錄中查詢名為a的包然後匯入。

絕對匯入:

absolute import 也叫作絕對引入,在Python2.5被完全實現。但是需要通過 from __future__ import absolute_import 來開啟該引入進位制

在Python2.6之後以及Python3,完全引用成為Python的預設的引入機制

注意:

Python直譯器會自動將當前工作目錄新增到PYTHONPATH這樣我們的sys.path(系統環境路徑)中就會包含當前工作目錄

在絕對匯入中,我們必須從包目錄最頂層目錄依次寫下一直到我們要匯入的最終那個子包,而不能從中間開始。Python直譯器會從sys.path中的目錄中查詢我們絕對引入的包的最頂層目錄,然後依次向下找到我們最終要匯入的那個子包

如:

Python直譯器會自動將當前工作目錄新增到PYTHONPATH。因此執行的時候,我們可以讓直譯器自動的將類庫的目錄新增到PYTHONPATH中。

如下面,我們cat run_ex3.py後,再使用絕對匯入,就可以正確執行ex3下的main.py檔案。

綜合舉例:

假如一個包結構是這樣的:

pkg/ 
pkg/init.py 
pkg/main.py 
pkg/string.py

此時,如果你在main.py中寫import string,那麼在Python 2.4或之前, Python會先查詢當前目錄下有沒有string.py, 若找到了,則引入該模組,然後你在main.py中可以直接用string了。注意這時候用的是同目錄下的string.py。

如果你是想用系統自帶的標準string.py呢?這時候你就需要from __future__ import absolute_import了。這樣你就可以用import string來引入系統的標準string.py, 而用from pkg import string來引入當前目錄下的string.py了

absolute_import:

用法:

from __future__ import absolute_import

這是一個在python3.0 以前的舊版本中啟用相對匯入等特性所必須的 future 語句, 是為了區分出絕對匯入和相對匯入。

加入from __future__ import absolute_import 之後,那麼在程式的編寫過程中使用類似from package.submodule import b 後匯入包b只會從系統環境路徑中尋找package.submodule,然後匯入其中的包b。

division:

在python2.x版本中匯入python3.0支援的語言特徵division(精確除法),當我們沒有在程式中匯入該特徵時,"/"操作符執行的是截斷除法(Truncating Division),當我們匯入精確除法之後,"/"執行的是精確除法。

如:

>>> 3/4
0
>>> from __future__ import division
>>> 3/4
0.75

# 匯入精確除法後,若要執行截斷除法,可以使用"//"操作符:

>>> 3//4
0
>>> 

print_function:

使用from __future__ import print_function後,在python2.X中匯入python3.0支援的print語句的特徵,這時再使用print就得像python3.X那樣加括號使用。python2.X中print不需要括號,而在python3.X中則需要。

如:

# python2.7
print "Hello world"

# python3
print("Hello world")