小議Python中的import

本文中所有代碼均運行在Python 2.7上

我們知道,在Python中的常見包(module)導入有兩種方法:import ...和from ... import ...鼓寺,那么在實際使用過程中酷含,這兩種方法又有哪些不同呢携添?
先說結(jié)論:

  1. 盡量使用import ...
  2. 有節(jié)制的使用from ... import ...
  3. 盡量避免from ... import *

說到原因全蝶,就先來看看import導入的內(nèi)部機制涯曲。當一個python文件初始化運行環(huán)境的時候雀监,會加載進來一些python的內(nèi)建包双吆。這些包在sys.modules中,使用下面的方法可以獲取這些包的相關信息会前。

>>> import sys
>>> sys.modules.items()
...(我就不告訴你輸出結(jié)果好乐,想要知道請自己實踐)

而所謂的"加載"的過程則分為以下幾步:

  1. sys.modules中尋找目標模塊,如果找到瓦宜,就把它導入到當前環(huán)境的局部命名空間蔚万,整個加載過程結(jié)束(一般適用于python的內(nèi)建(built in)模塊);而沒有找到的話就依次執(zhí)行以下操作临庇;
  2. 為目標模塊創(chuàng)建一個特定的dict反璃,并插到sys.modules中;
  3. 對目標模塊進行編譯假夺,這也就是我們?yōu)槭裁纯偰芸匆姾枚?.pyc 文件的原因淮蜈;
  4. 將編譯結(jié)果放到事先在sys.modules中創(chuàng)建的對應dict中;

那import a和from a import B又有什么區(qū)別呢已卷?
區(qū)別在于前者是將a加入當前的局部命名空間梧田,而后者則將B直接暴露到局部命名空間當中。

那么悼尾,這又會引發(fā)什么問題呢柿扣?

  1. 命名沖突
    假設有模塊a.py:
def echo():
    print 'I am echo from module a'

有模塊b.py:

def echo():
    print 'I am echo from module b'

我們現(xiàn)在要使用這兩個模塊:

>>> from a import echo
>>> from b import echo
>>> echo()
I am echo from module b

可見,當發(fā)生命名沖突的時候闺魏,后引入的方法或者屬性將覆蓋先引入的未状。
所以,之前說要“有節(jié)制”的使用from a import b析桥,因為它有命名沖突的隱患司草,只有當明確沒有命名沖突艰垂,并且以下情況下,才使用from ... import ...

  • 只使用導入模塊中少數(shù)幾個方法或?qū)傩?/li>
  • 這些屬性使用頻繁或者嵌套層級較深埋虹,不便于去使用'a.B'的方式去調(diào)用
  1. 循環(huán)引用
    當處理比較大的項目的時候猜憎,很容易出現(xiàn)下面情況:
    有文件py1.py
from py2 import helper2
def helper1():
    pass

另有文件py2.py

from py1 import helper1
def helper2():
    pass

此時,運行py1.py和py2.py中的任意一個都會報ImportError搔课。因為py1的運行環(huán)境初始化需要調(diào)用py2的編譯后的字節(jié)碼胰柑,py2亦然。這也是比較常見的錯誤爬泥,需要在實際中注意避免柬讨。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市袍啡,隨后出現(xiàn)的幾起案子踩官,更是在濱河造成了極大的恐慌,老刑警劉巖境输,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔗牡,死亡現(xiàn)場離奇詭異,居然都是意外死亡嗅剖,警方通過查閱死者的電腦和手機辩越,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來信粮,“玉大人区匣,你說我怎么就攤上這事〗海” “怎么了亏钩?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長欺旧。 經(jīng)常有香客問我姑丑,道長,這世上最難降的妖魔是什么辞友? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任栅哀,我火速辦了婚禮,結(jié)果婚禮上称龙,老公的妹妹穿的比我還像新娘留拾。我一直安慰自己,他們只是感情好鲫尊,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布痴柔。 她就那樣靜靜地躺著,像睡著了一般疫向。 火紅的嫁衣襯著肌膚如雪咳蔚。 梳的紋絲不亂的頭發(fā)上豪嚎,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音谈火,去河邊找鬼侈询。 笑死,一個胖子當著我的面吹牛糯耍,可吹牛的內(nèi)容都是我干的扔字。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼温技,長吁一口氣:“原來是場噩夢啊……” “哼啦租!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荒揣,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焊刹,沒想到半個月后系任,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡虐块,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年俩滥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贺奠。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡霜旧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出儡率,到底是詐尸還是另有隱情挂据,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布儿普,位于F島的核電站崎逃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏眉孩。R本人自食惡果不足惜个绍,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浪汪。 院中可真熱鬧巴柿,春花似錦、人聲如沸死遭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呀潭。三九已至袁波,卻和暖如春瓦阐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篷牌。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工睡蟋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枷颊。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓戳杀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夭苗。 傳聞我的和親對象是個殘疾皇子信卡,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容