패키지
패키지 사용 이유: 함수로 구성된, 클래스로 구성된 모듈이 점점 많아져서 코드를 이해하기 어려워지면 다른 계층을 추가 도입하여 코드를 좀 더 이해하기 쉽게 바꾼다. 즉, 다른 모듈들을 포함하는 모듈
특징
다른 패키지 안에서 패키지 디렉터리가 있는 경우 적용할 수 있고, 패키지 기능은 두 가지 역할을 담당한다
예시
main.py
mypackage/__init__.py
mypackage/models.py
mypackage/utils.py
#utils 모듈을 임포트하려면 패키지 디렉터리 이름이 포함된 절대적인 모듈 이름을 사용하면 된다.
##main.py
from mypackage import utils
패키지의 첫 번째 역할은 모듈을 별도의 이름 공간으로 분리하라
#utils.py라는 같은 이름의 모듈로부터 애트리뷰트를 임포트하는 프로그램이다.
#main.py
from analysis.utils import log_base2_bucket
from frontend.utils import stringify
bucket = stringify(log_base2_bucket(33))
"""
패키지 안에 정의된 함수,클래스, 하위 모듈의 이름이 같으면 이런 접근 방법을 사용할 수 없다.
즉, analysis와 fronted.utils에 있는 inspect 함수를 함께 사용하고 싶다면, 직접 임포트하면 두 번째 import 문에서 현재 영역의 inspect 값을 덮어 쓰기 때문에 동시에 두 함수를 사용할 수 없다.
"""
#main2.py
from analysis.utils import inspect
from fronted.utils import inspect#덮어쓰기
해결: import 문에 as 절을 사용해서 현재 영역에 임포트한 대상의 이름을 변경
as 절을 사용하면 import 가져온 대상이 무엇이든 관계없이 이름을 마음대로 바꿀 수 있고 임포트한 모듈 이름도 바꿀 수 있다.
from analysis.utils import inspect as analysis_inspect
from frontend.utils import inspect as frontend_insepct
value = 33
if anlaysis_inspect(value) == frontend_inspect(value):
print('인스펙션 결과가 같음!")
API는 릴리스할 때 변경되지 않는 안정적인 기능을 제공하고 싶다.
이런 기능을 제공하기 위해선 외부 사용자로부터 내부 코드 조직을 감춰야한다.
all의 값은 모듈에서 외부로 공개된 API로 익스포트할 모든 이름이 들어있는 리스트다.
파이썬 패키지로 안정적인 동작 수행
init.py 안에 여러분이 외부에 공개할 이름만 제한적으로 임포트해 넣으면 mypackage의 외부 API 명시적 지정
이미 all을 지정했으므로, 내부 모듈의 모든 내용을 임포트하고 적절히 변경하면 mypackage의 공개 인터페이스를 노출 시킬 수 있다.
#__init__.py
__all__ =[]
from . models import *
__all__ += models.__all__
from utils import *
__sll__ += utils.__all__
파이썬 패키지는 다른 모듈을 포함하는 모듈로 패키지를 사용하면 서로 분리돼 충돌이 일어나지 않는, 유일한 절대 모듈 경로를 사용하는 이름 공간으로 코드를 나눌 수 있다.
다른 소스 파일이 들어있는 디렉터리에 init.py 파일을 추가하면 간단한 패키지를 만들 수 있다.
소스 파일은 디렉터리에 인해 생긴 패키지의 자식 모듈이 된다.
패키지 디렉터리에는 다른 패키지가 들어갈 수 있다.
모듈 외부에서 볼 수 있게 허용할 이름을 all 특별 애트리뷰트에 지정해 공개 API를 제공할 수 있다.