日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
關(guān)于包導(dǎo)入,這三個(gè)知識(shí)點(diǎn)太多人不知道了

1. 使用 __all__ 控制可被導(dǎo)入的變量

專注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)東光免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

使用 from module import * 默認(rèn)情況下會(huì)導(dǎo)入 module 里的所有變量,若你只想從模塊中導(dǎo)入其中幾個(gè)變量,可以在 module 中使用 __all__ 來(lái)控制想要被其他模塊導(dǎo)入的變量。

 
 
 
 
  1. # profile.py 
  2. name='小明' 
  3. age=18 
  4.  
  5. __all__=['name'] 

打開(kāi) python console 驗(yàn)證一下

 
 
 
 
  1. >>> from profile import * 
  2. >>> print(name) 
  3. 小明 
  4. >>> print(age) 
  5. Traceback (most recent call last): 
  6.   File "", line 1, in  
  7. NameError: name 'age' is not defined 

__all__ 僅對(duì)于使用from module import * 這種情況適用。

它經(jīng)常在一個(gè)包的 __init__.py 中出現(xiàn)。

2. 命名空間包的神奇之處

命名空間包,對(duì)于不少人來(lái)說(shuō),可能是一個(gè)陌生的名字。

與我們熟悉的常規(guī)包不同的是,它沒(méi)有 __init__.py 文件。

更為特殊的是,它可以跨空間地將兩個(gè)不相鄰的子包,合并成一個(gè)虛擬機(jī)的包,我們將其稱之為 命名空間包。

例如,一個(gè)項(xiàng)目的部分代碼布局如下

 
 
 
 
  1. foo-package/ 
  2.     spam/ 
  3.         blah.py 
  4.  
  5. bar-package/ 
  6.     spam/ 
  7.         grok.py 

在這2個(gè)目錄里,都有著共同的命名空間spam。在任何一個(gè)目錄里都沒(méi)有__init__.py文件。

讓我們看看,如果將foo-package和bar-package都加到python模塊路徑并嘗試導(dǎo)入會(huì)發(fā)生什么?

 
 
 
 
  1. >>> import sys 
  2. >>> sys.path.extend(['foo-package', 'bar-package']) 
  3. >>> import spam.blah 
  4. >>> import spam.grok 
  5. >>> 

當(dāng)一個(gè)包為命名空間包時(shí),他就不再和常規(guī)包一樣具有 __file_ 屬性,取而代之的是 __path__

 
 
 
 
  1. >>> import sys 
  2. >>> sys.path.extend(['foo-package', 'bar-package']) 
  3. >>> import spam.blah 
  4. >>> import spam.grok 
  5. >>> spam.__path__ 
  6. _NamespacePath(['foo-package/spam', 'bar-package/spam']) 
  7. >>> spam.__file__ 
  8. Traceback (most recent call last): 
  9.     File "", line 1, in  
  10. AttributeError: 'module' object has no attribute '__file__' 

3. 模塊重載中的一個(gè)坑

由于有 sys.modules 的存在,當(dāng)你導(dǎo)入一個(gè)已導(dǎo)入的模塊時(shí),實(shí)際上是沒(méi)有效果的。

為了達(dá)到模塊的重載,有的人會(huì)將已導(dǎo)入的包從 sys.modules 中移除后再導(dǎo)入

就像下面這樣子

 
 
 
 
  1. >>> import foo.bar 
  2. successful to be imported 
  3. >>> 
  4. >>> import foo.bar 
  5. >>> 
  6. >>> import sys 
  7. >>> sys.modules['foo.bar'] 
  8.  
  9. >>> del sys.modules['foo.bar'] 
  10. >>> 
  11. >>> import foo.bar 
  12. successful to be imported 

上面的例子里我使用的是import foo.bar ,如果你使用的是 from foo import bar 這種導(dǎo)入形式,會(huì)發(fā)現(xiàn)重載是同樣是無(wú)效的。

這應(yīng)該算是一個(gè)小坑,不知道的人,會(huì)掉入坑中爬不出來(lái)。

 
 
 
 
  1. >>> import foo.bar 
  2. successful to be imported 
  3. >>> 
  4. >>> import foo.bar 
  5. >>> 
  6. >>> import sys 
  7. >>> del sys.modules['foo.bar'] 
  8. >>> from foo import bar 
  9. >>> 

因此,在生產(chǎn)環(huán)境中可能需要避免重新加載模塊。而在調(diào)試模式中,它會(huì)提供一定的便利,但你要知道這個(gè)重載的弊端,以免掉入坑里。

本文轉(zhuǎn)載自微信公眾號(hào)「Python編程時(shí)光」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Python編程時(shí)光公眾號(hào)。


當(dāng)前題目:關(guān)于包導(dǎo)入,這三個(gè)知識(shí)點(diǎn)太多人不知道了
本文鏈接:http://www.5511xx.com/article/dhioheh.html