2014-06-17 199 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