2014-06-17 4 views
-1

내가받은 다음 파일 파이썬 가져 오기 기능 __init__

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

및 util.py 내부

내가

def funA(): 
    print 'Hello World !' 

과 내가 가진 평 ./code/ 초기화 내부에있다

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

이제 현재 디렉토리에 python 프롬프트 (실제로는 ipython)가 열립니다. 전자

from code import * 

모든 내가있어이 폴더의 유틸리티 모듈

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

funA의 네임 스페이스를 사용할 수 있도록 util import *가 실행되지 않는 이유를 모르겠습니다. – Jing

+1

@ Jing : 실행됩니다. 문제는'code'로 가져 오는 모든 것이 숨겨져 있다는 것입니다. 왜냐하면'__all__'은'code'에게 모든 것을 노출시키지 않기 때문입니다. 다시 말해,'from util import *'는 모든 것을 * code'*로 가져 오지만,'code'는'from code import * '를 통해 "out"을 가져 오지 못하도록 차단합니다. – BrenBarn