成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于包導入,這三個知識點太多人不知道了

開發 前端
使用 from module import * 默認情況下會導入 module 里的所有變量,若你只想從模塊中導入其中幾個變量,可以在 module 中使用 __all__ 來控制想要被其他模塊導入的變量。

 [[374236]]

1. 使用 __all__ 控制可被導入的變量

使用 from module import * 默認情況下會導入 module 里的所有變量,若你只想從模塊中導入其中幾個變量,可以在 module 中使用 __all__ 來控制想要被其他模塊導入的變量。

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

打開 python console 驗證一下

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

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

它經常在一個包的 __init__.py 中出現。

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

命名空間包,對于不少人來說,可能是一個陌生的名字。

與我們熟悉的常規包不同的是,它沒有 __init__.py 文件。

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

例如,一個項目的部分代碼布局如下

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

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

讓我們看看,如果將foo-package和bar-package都加到python模塊路徑并嘗試導入會發生什么?

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

當一個包為命名空間包時,他就不再和常規包一樣具有 __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 "<stdin>", line 1, in <module> 
  10. AttributeError: 'module' object has no attribute '__file__' 

3. 模塊重載中的一個坑

由于有 sys.modules 的存在,當你導入一個已導入的模塊時,實際上是沒有效果的。

為了達到模塊的重載,有的人會將已導入的包從 sys.modules 中移除后再導入

就像下面這樣子

  1. >>> import foo.bar 
  2. successful to be imported 
  3. >>> 
  4. >>> import foo.bar 
  5. >>> 
  6. >>> import sys 
  7. >>> sys.modules['foo.bar'
  8. <module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'
  9. >>> del sys.modules['foo.bar'
  10. >>> 
  11. >>> import foo.bar 
  12. successful to be imported 

上面的例子里我使用的是import foo.bar ,如果你使用的是 from foo import bar 這種導入形式,會發現重載是同樣是無效的。

這應該算是一個小坑,不知道的人,會掉入坑中爬不出來。

  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. >>> 

因此,在生產環境中可能需要避免重新加載模塊。而在調試模式中,它會提供一定的便利,但你要知道這個重載的弊端,以免掉入坑里。

本文轉載自微信公眾號「Python編程時光」,可以通過以下二維碼關注。轉載本文請聯系Python編程時光公眾號。

 

責任編輯:武曉燕 來源: Python編程時光
相關推薦

2019-10-09 10:21:20

負載均衡架構開發

2021-01-15 05:39:13

HashMapHashTableTreeMap

2011-08-16 13:15:15

MongoDB

2020-06-29 08:28:36

v-for 解構函數

2022-10-27 21:01:03

JavaScrip面試題開發

2020-09-17 13:44:58

Python開源軟件

2020-07-14 08:43:54

VueHTML函數

2021-08-24 00:13:23

Windows 10Windows微軟

2022-06-23 13:13:36

GitHub開發技巧

2021-02-24 09:45:21

數據庫工具技術

2020-10-09 11:30:07

Redis緩存數據庫

2015-07-22 11:53:29

云計算AWS分析癱瘓

2019-01-07 09:27:39

2021-01-12 12:33:20

Pandas技巧代碼

2021-10-09 16:13:40

5G4G手機

2020-06-12 07:36:33

Redis

2017-01-06 10:07:39

Linuxwindowsatime

2021-11-02 19:14:58

Spring數據

2021-08-29 23:22:05

iPhone手機安卓

2025-04-16 07:06:43

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲永久字幕 | 色综合天天天天做夜夜夜夜做 | 91在线视频免费观看 | 精品亚洲一区二区 | 国产女人与拘做受视频 | 一级毛片高清 | 午夜在线视频 | 欧美区精品 | 一本大道久久a久久精二百 欧洲一区二区三区 | 久久久日韩精品一区二区三区 | 在线免费激情视频 | www.色.com | 国产欧美日韩一区 | 天天看逼| www.亚洲.com | 亚洲欧美日韩精品久久亚洲区 | 精品日韩| 久久精品欧美一区二区三区不卡 | 国产亚洲精品精品国产亚洲综合 | 久久久久久久久久久久91 | 亚洲欧美综合精品久久成人 | 九九热这里 | 在线观看av网站永久 | www.99热这里只有精品 | 综合久久久 | 日韩成人免费av | 久久黄色精品视频 | 黄色毛片在线看 | 日本精品网站 | 亚洲第一在线视频 | 91精品久久久久久久久久入口 | av在线视| 日本免费在线观看视频 | 久久免费电影 | 免费福利视频一区二区三区 | 亚洲va欧美va天堂v国产综合 | 亚洲精品18 | 精品一区欧美 | 亚洲 欧美 另类 日韩 | 久久久久国产一级毛片 | 成人小视频在线观看 |