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

时间:2014-12-15 22:34:55

标签: python

文件结构;

./__init__.py
  a.py
    /lib
    __init__.py
    Foo1.py # contains `class Foo1`
    Foo2.py # contains `class Foo2`
    # so on ...

a.py中对此进行了测试,并且正在执行此操作;

from lib.Foo1 import Foo1
from lib.Foo2 import Foo2

但是,当我在from lib import * __all__ = ["Foo1", "Foo2"] __init__.py时,它无法正常工作。

错误:<type 'exceptions.TypeError'>: 'module' object is not callable

我失踪了什么?

这是a.py;

#!/usr/bin/python 

import cgi, cgitb
cgitb.enable()

from lib import *

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

foo1 = Foo1()
foo2 = Foo2() 

//使用此refs:
// http://docs.python.org/2/tutorial/modules.html#importing-from-a-package
// Loading all modules in a folder in Python

3 个答案:

答案 0 :(得分:4)

from lib import *

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

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

from lib.Foo1 import *
from lib.Foo2 import *

globals()成为

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

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

答案 1 :(得分:2)

将以下内容添加到您的... / lib / __ init__.py文件中:

from Foo1 import Foo1
from Foo2 import Foo1

__all__ = ['Foo1', 'Foo2']

请注意,PEP-8建议package and modules names be all lowercase以避免混淆。

答案 2 :(得分:2)

从软件包导入*时(在您的情况下,使用__all__中的init.py__all__指定所有要加载并导入当前模块的模块命名空间。

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

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

请查看Importing * in Python以获得快速说明。