2016-08-02 57 views
0

我只是學習和實踐蟒蛇,在路上,我讀了Python包和如何導入到另一個模塊或包在Modules,我認爲以下情形,包__init__.py中沒有定義__all__的結果?

我有封裝,

Video/ 
    __init__.py 
    formats/ 
     __init__.py 
     mkv.py 
     mp4.py 
    length/ 
     __init__.py 
     morethan20min.py 
     lessthan20min.py 

,並沒有

__init__.py 

我還沒有定義

__all__ 

如果我有一個import語句會發生什麼,在第一條語句

import Video.format.mkv 
import Video.formats.* 

既然我已經導入MKV模塊,第二個import語句執行後到底發生了什麼,我沒有閱讀後得到的概念提到的鏈接。

+1

正確的名稱是'__init __。py',而不是'__init.py__'。 – user2357112

+0

你不會得到一個錯誤,它只是多餘的你要麼從Video.format得到一切,要麼你得到一些特定的東西。這就像說我只想要一個人,但是你接下來每個人。所以沒有必要把這個人放在第一位。 –

+0

另外,你不能'導入Video.formats。*'。 '*'只能導入import語句的'from'形式。 – user2357112

回答

2

當你

from whatever_package import * 

第一,如果封裝的__init__.py尚未運行,它將會運行。 (如果你已經做import whatever_package.something_specific,包的__init__.py將已經運行。)

然後,如果whatever_package.__init__沒有定義__all__列表,導入將拿起whatever_package對象的所有當前內容*。這將是__init__.py中定義的任何內容以及任何已由程序中執行的任何代碼明確導入的子模塊。例如,如果whatever_package__init__.py是空的,你做

import whatever_package.something_specific 
from whatever_package import * 
import whatever_package.other_thing 

以及與whatever_package沒有其他import語句在你的程序存在,那麼import *會拿起something_specific,但不是whatever_package任何其他子模塊,例如作爲other_thing


*不包括任何以下劃線開頭,如對於無__all__列表中的任何import *標準,無論你是從一個包或一個正常的模塊導入。

+0

如果'something_specific .__ init__'不是空的,會發生什麼 – user6654733

+0

@ user6654733:導入會選擇由__init __。py'定義的任何東西。 – user2357112

+0

@ user6654733:那麼在導入語句中有*符號的優點是什麼?只有當我們定義'__all__'時纔有用。 – user6654733