안정적인 API를 제공하라

매일 공부(ML)·2022년 10월 18일
0

파이썬 코딩의 기술

목록 보기
22/27

패키지를 사용해 모듈을 체계화하고 안정적인 API를 제공하라

패키지

패키지 사용 이유: 함수로 구성된, 클래스로 구성된 모듈이 점점 많아져서 코드를 이해하기 어려워지면 다른 계층을 추가 도입하여 코드를 좀 더 이해하기 쉽게 바꾼다. 즉, 다른 모듈들을 포함하는 모듈

  • 특징

    • init.py라는 이름의 빈 파일을 디렉토리에 추가하여 패키지 정의
    • init.py가 있는 디렉터리가 있다면, 다른 파이썬 파일은 _init.py가 있는 디렉터리를 기준으로 상대적인 경로를 통해서 임포트해서 사용한다.
  • 다른 패키지 안에서 패키지 디렉터리가 있는 경우 적용할 수 있고, 패키지 기능은 두 가지 역할을 담당한다

  • 예시

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

  • API는 릴리스할 때 변경되지 않는 안정적인 기능을 제공하고 싶다.

  • 이런 기능을 제공하기 위해선 외부 사용자로부터 내부 코드 조직을 감춰야한다.

    • 외부 사용자의 코드를 깨지 않고 여러분 패키지의 내부 모듈을 리팩터링하고 개선할 수 있다.
  • all의 값은 모듈에서 외부로 공개된 API로 익스포트할 모든 이름이 들어있는 리스트다.

    • from fo import *

  • 파이썬 패키지로 안정적인 동작 수행

    • init.py 안에 여러분이 외부에 공개할 이름만 제한적으로 임포트해 넣으면 mypackage의 외부 API 명시적 지정

    • 이미 all을 지정했으므로, 내부 모듈의 모든 내용을 임포트하고 적절히 변경하면 mypackage의 공개 인터페이스를 노출 시킬 수 있다.

#__init__.py

__all__ =[]

from . models import *

__all__ += models.__all__

from utils import *
__sll__ += utils.__all__

Summary

  • 파이썬 패키지는 다른 모듈을 포함하는 모듈로 패키지를 사용하면 서로 분리돼 충돌이 일어나지 않는, 유일한 절대 모듈 경로를 사용하는 이름 공간으로 코드를 나눌 수 있다.

  • 다른 소스 파일이 들어있는 디렉터리에 init.py 파일을 추가하면 간단한 패키지를 만들 수 있다.

  • 소스 파일은 디렉터리에 인해 생긴 패키지의 자식 모듈이 된다.

  • 패키지 디렉터리에는 다른 패키지가 들어갈 수 있다.

  • 모듈 외부에서 볼 수 있게 허용할 이름을 all 특별 애트리뷰트에 지정해 공개 API를 제공할 수 있다.

profile
성장을 도울 아카이빙 블로그

0개의 댓글