2017-10-20 67 views
0

當我在numpy \ __ init__.py庫中看到代碼後,試圖自己寫__init__.py時,我很困惑。如何在__init__.py中正確地擴展變量__all__?

這裏是numpy的\ __ init__.py代碼片段

__all__.extend(['__version__', 'pkgload', 'PackageLoader', 
      'show_config']) 
__all__.extend(core.__all__) 
__all__.extend(_mat.__all__) 
__all__.extend(lib.__all__) 
__all__.extend(['linalg', 'fft', 'random', 'ctypeslib', 'ma']) 

而且我的目錄結構是:

應用程序/

...... test.py

。 ..... lib1 \

............ __init__.py

............ Lib1File.py

............ sublib1 \

.......... .. ............ __init__.py

............ ............ SubLib1File.py

在test.py的代碼是

from lib1 import * 

if __name__ == "__main__": 
    result1 = Lib1File.add(10, 15) # a simple function in Lib1File.py 
    print(result1) 
    result2 = Sublib1File.mul(10,15) # a simple function in Sublib1File.py 
    print(result2) 

在LIB1代碼\ __ init__.py是

from . import sublib1 
__all__ = ["Lib1File"] 
__all__.extend(sublib1.__all__) 
print(__all__)     # it can print ['Lib1File', 'Sublib1File'] on console 

在LIB1代碼\ sublib1 \ __ init__.py是

__all__ = ["Sublib1File"] 

但是,當我跑test.py,我得到了一個錯誤

*文件 「test.py」,行1,在模塊中從lib1導入。 AttributeError的:模塊 'LIB1' 有沒有屬性 'Sublib1File'

我的問題是

  1. 爲什麼我在LIB1 \ __ init__.py得到這個錯誤,即使__all__ = ['Lib1File', 'Sublib1File']

  2. 我應該如何修復它,如果我仍然只使用一個進口from lib1 import *

  3. 如果我們不能解決問題2,那麼在numpy \ __ init__中__all__.extend(...)的目的是什麼?

回答

1

如果你再看看numpy的頂尖級__init__模塊,你會看到每個from . import xyz這是我們用來擴展__all__有一個相應的from .xyz import *

如果相應的對象沒有在模塊本身中定義或從其他地方導入,則爲模塊的__all__添加名稱將不起作用。

添加from .sublib1 import *低於from . import sublib1lib1/__init__.py

+0

是的,我注意到了。但我仍然不知道如何解決這個問題。你能給我更具體的修改嗎?謝謝 –

1

擴展@wyatts回答,添加以下行lib1/__init__.py

from .sublib1 import * 

爲了讓這個例子的工作。

0

你是對的@Wyatt,@MegaIng。

我在這裏回答了三個問題的答案,以防萬一別人需要它。

Q1。爲什麼即使在lib1__init__.py中有__all__ = ['Lib1File', 'Sublib1File']也會出現此錯誤?

A1。因爲您只需將模塊名稱添加到__all__。但實際上lib1目錄中沒有SublibFile模塊。所以Python無法找到模塊名稱的SublibFile模塊的定義。

Q2。我應該如何修復它,如果我仍然只使用一個import from lib1 import *

A2。在lib1/__init__.py中添加一行from .sublib1 import *。這將把__all__中定義的模塊放在lib1\sublib1\__init__.pylib\包中,以便python可以通過模塊名稱找到函數模塊定義。

Q3。 __all__.extend(...)numpy\__init__中的用途是什麼?

A3。爲了延伸__all__的靈活性。