Python:为什么“__all__”不能用于导入?

Python: Why “__all__” doesn't work for import?

文件结构;

1
2
3
4
5
6
7
./__init__.py
  a.py
    /lib
    __init__.py
    Foo1.py # contains `class Foo1`
    Foo2.py # contains `class Foo2`
    # so on ...

a.py中测试了这个,并进行了工作;

1
2
from lib.Foo1 import Foo1
from lib.Foo2 import Foo2

但是,当我在__init__.py中执行__all__ = ["Foo1","Foo2"]时,它不起作用。

错误:: 'module' object is not callable

我错过了什么?

这是a.py

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python

import cgi, cgitb
cgitb.enable()

from lib import *

print"Content-Type: text/html"
print""
print"Test!"

foo1 = Foo1()
foo2 = Foo2()

//使用了以下引用://http://docs.python.org/2/tutorial/modules.html从-a-package导入//加载python文件夹中的所有模块


1
from lib import *

lib中的所有内容导入当前模块,因此我们的globals()看起来如下:

1
2
{'Foo1':<module lib.Foo1>,
 'Foo2':<module lib.Foo2>}

鉴于

1
2
from lib.Foo1 import *
from lib.Foo2 import *

使我们的globals()成为

1
2
{'Foo1':<class lib.Foo1.Foo1>,
 'Foo2':<class lib.Foo2.Foo2>}

所以在第一种情况下,我们只是导入模块,而不是我们想要的模块内部的类。


从包中导入*时(如您的情况,使用init.py中的__all__时),__all__指定应加载并导入当前命名空间的所有模块。

因此,在您的情况下,from lib import *将导入模块Foo1Foo2,您需要访问这样的类:

1
2
foo1 = Foo1.Foo1()
foo2 = Foo2.Foo2()

请看一下在python中导入*以快速澄清。


将以下内容添加到…/lib/uuu init_uuuy文件中:

1
2
3
4
from Foo1 import Foo1
from Foo2 import Foo1

__all__ = ['Foo1', 'Foo2']

注意,PEP-8建议包和模块名称都是小写的,以避免混淆。