앞서서 모듈에 대해서 살펴봤다.
패키지는 모듈과의 성격이 유사하여 비슷하게 사용이 되지만, 파이썬 doc을 이용하여
패키지는 "점으로 구분된 모듈 이름" 을 써서
파이썬의 모듈 이름 공간을 구조화하는 방법
ex. A.B → A 라는 이름의 패키지에 있는 B 라는 이름의 서브 모듈
모듈의 사용 → 다른 모듈의 저자들이 서로의 전역 변수 이름들을 걱정할 필요 없게 만듦
sound/ Top-level package
**__init__.py** Initialize the sound package
formats/ Subpackage for file format conversions
**__init__.py**
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
**__init__.py**
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
**__init__.py**
equalizer.py
vocoder.py
karaoke.py
...
패키지를 임포트할 때, 파이썬은 sys.path 에 있는 디렉토리들을 검색하면서 패키지 서브 디렉토리를 찾는다
파이썬이 디렉토리를 패지키로 취급하기 위해서는 __init__.py
파일이 필요
이렇게 하면 string 처럼 흔히 쓰는 이름의 디렉토리가, 의도하지 않게 모듈 검색 경로의 뒤에 등장하는 올바른 모듈들을 가리는 일을 방지
가장 간단한 경우 → __init__.py
는 그냥 빈 파일이지만
패키지의 초기화 코드를 실행하거나 뒤에서 설명하는 __all__
변수를 설정할 수도 있다
패지키 사용자는 패키지로부터 개별 모듈을 import
할 수 있다
import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)
from package import item
사용시item 은 패키지의 서브 모듈 (또는 서브 패키지) 일 수도 있고
함수, 클래스, 변수 등 패키지에 정의된 이름들일 수도 있음을 주의
import 문은 먼저 item이 패키지에 정의되어 있는지 검사
그렇지 않으면 모듈이라고 가정하고 로드 시도
→ 찾지 못한다면, ImportError
예외 발생
import item.subitem.subsubitem
와 같은 문법을 사용할 때마지막 제외 항목 → 반드시 패키지
마지막 항목 → 모듈이나 패키지가 될 수 있지만
(클래스, 함수, 변수 등이 될 수는 없다)
import
하기from sound.effects import *
라고 쓰면 어떤 일이 발생할까?
(이상적으로는) 어떻게든 파일 시스템에서 패키지에 어떤 모듈들이 들어있는지 찾고,
→ 그것을 모두를 import 하기를 희망
import
함에 따라 어떤 서브 모듈을 명시적으로 import
할 경우만 일어나야 하는 원하지 않는 부수적 효과 발생index
을 명시적으로 제공__import__.py
코드가 __all__
이라는 이름의 목록을 제공하면,이것을 from package import *
를 만날 때 import
해야만 하는 모듈 이름들의 목록으로 받아들인다
새 버전의 패키지를 출시할 때, 이 목록을 최신 상태로 유지하는 것은 패키지 저자의 책임
패키지 저자가 패키지에서 * 를 import 하는 용도가 없다고 판단하면, 지원하지 않아도 된다
# sound/effects/__init__.py
__all__ = ["echo", "surround", "revers"]
from sound.effects import *
이 sound.effects
패키지의 세 서브 모듈들을 import 하게 됨을 의미__all__
이 정의되지 않으면문장 from sound.effects import *
은 패키지 sound.effects
의 모든 서브 모듈들을 현재 이름 공간으로 임포트 하지 않는다
이것은 오직 패키지 sound.effects 가 임포트 되도록 만들고
그 패키지가 정의하는 이름들을 import
이 이름들은 __init__.py
가 정의하는 모든 이름을 포함
이 이름들에는 사전에 import 문으로 명시적으로 로드된 패키지의 서브 모듈들 역시 포함
import sound.effects.echo
import sound.effects.surround
from sound.effects import *
이 예에서, echo 와 surround 모듈이 현재 이름 공간으로 import
어떤 모듈이 import *
를 사용할 때 특정 패턴을 따르는 이름들만 export 하도록 설계되었다 하더라도, 프로덕션 코드에서는 여전히 좋지 않은 사례로 여겨진다
from package import specific_submodule
을 사용하는데 잘못된 것은 없다는 것 기억
import 하는 모듈이 다른 패키지에서 같은 이름의 서브 모듈을 사용할 필요가 없는 한 권장되는 표기법
패키지가 서브 패키지들로 구조화될 때
이웃 패키지의 서브 모듈을 가리키는데 import
사용 가능
예를 들어,
모듈 sound.**filters**.vocoder
이
sound.**effects
** 패키지의 echo
모듈이 필요하다면,
from sound.effects import echo
를 사용할 수 있다
상대 import 를 사용할 수도 있는데, from module import name
형태로 import
문 사용
이 import
는 상대 import
에 수반되는 현재와 부모 패키지를 가리키기 위해 앞에 붙는 점 사용
from . import echo
from .. import formats
from ..filters import equalizer
상대 import 가 현재 모듈의 이름에 기반을 둔다는 것을 주의
메일 모듈의 이름은 항상 "main" 이기 때문에
파이썬 응용 프로그램의 메인 모듈로 사용될 목적의 모듈들은 반드시 절대 임포트를 사용해야 한다
__path__
이것은 패지키의 init.py 파일을 실행하기 전에,
이 파일에 들어있는 디렉토리의 이름을 포함하는 리스트로 초기화
이 변수는 수정 가능
→ 그렇게 하면 그 이후로 패키지에 포함된 모듈과 서브 패키지를 검색하는 데 영향을 준다
(패키지에서 발견되는 모듈의 집합을 확장하는 데 사용)
# import effects
from effects import *
# from effects import echo
if __name__ == "__main__":
print("hello world")
print(__name__)
지금까지 모듈과 패키지의 파이썬 문서 번역에 대해서 살펴봤다
출처 : https://docs.python.org/ko/3/tutorial/modules.html