2014-06-17 247 views
-1

我得到了以下文件蟒蛇導入功能__init__

1 ./run.py 
2 ./code/util.py 
3 ./code/__init__.py 

和內部util.py我有

def funA(): 
    print 'Hello World !' 

和./code/ 初始化的.py我裏面有

__all__=['util']; 
from util import * 

現在我打開當前目錄中的python提示符(實際上,ipython),然後我typ Ë

from code import * 

和我的一切是UTIL模塊

util  module <module 'code.util' from 'code/util.pyc'> 

,我必須包括以使用FUNA包名()。 我預計funA現在在我的名字空間,我可以使用它沒有包名稱code.funA。但是,情況並非如此,我想知道問題出在哪裏。 我想我仍然有點困惑,應該如何使用__ init __.py。

+0

如果你想要其他東西(比如'funA')可用,你爲什麼指定'__all__ = ['util']'? – BrenBarn

+0

我應該怎麼做?是不是__all__ = ['util']必要? – Jing

+0

我想你是誤解'__all__'的用途。看到我的答案。 – BrenBarn

回答

1

__all__(如documented)的目的是要表明您想要所列的名稱通過from mymodule import *可用。通過僅指定'util',您明確告訴您的程序包除了util之外沒有其他任何東西可用。如果您刪除了__all__,那麼您從util內導入的所有內容也都將在code中提供,因此如果您的操作是from code import *,那麼util中的所有內容也都可用。

這是一個好主意是另一回事。導入*通常會導致混淆。

+0

謝謝!它現在有效。 – Jing

+0

我不明白爲什麼從util導入*沒有執行,使funA的命名空間可用。 – Jing

+1

@Jing:它被執行。問題在於它導入到代碼中的所有內容都是隱藏的,因爲'__all__'告訴'代碼'不要公開所有東西。換句話說,您的'from util import *'將所有內容*導入到'code' *中,但是''''''將它從'import import *'中通過''out'導入「out」。 – BrenBarn