2014-12-15 1 views
3

파일 구조;Python : "__all__"이 (가) 가져 오기에 적합하지 않은 이유는 무엇입니까?

./__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 

그러나, 나는 그것이 작동하지 않습니다 __all__ = ["Foo1", "Foo2"]__init__.py에서하고 from lib import *을한다.

오류 : 나는 <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() 

// 사용이 심판 :
// http://docs.python.org/2/tutorial/modules.html#importing-from-a-package
// Loading all modules in a folder in Python

답변

2

가 당신에 다음을 추가 .../lib 디렉토리/__ init__.py 파일 :

from Foo1 import Foo1 
from Foo2 import Foo1 

__all__ = ['Foo1', 'Foo2'] 

PEP-8은 혼동을 피하기 위해 package and modules names be all lowercase을 권장합니다. 같은

4
from lib import * 

은 현재 모듈에 lib 모든 것을 가져옵니다, 그래서 우리의 globals() 보인다 :

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

globals()이 될 우리 만듭니다

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

반면

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

첫 번째 경우에는 모듈을 가져 오는 것이지 내부 클래스는 우리가 원하는 것입니다.

2

__all__는 현재 이름 공간에로드 및 수입되어야 모든 모듈을 지정합니다 (__all__init.py에 사용, 귀하의 경우와 같이) 패키지에서 *를 가져.

따라서, 귀하의 경우, from lib import *는 모듈 Foo1Foo2를 가져옵니다 그리고 당신과 같이 클래스에 액세스해야합니다

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

가 빠른 해명 Importing * in Python에서보세요.

관련 문제