__all__특수 변수 정리
shapes 패키지 구조
shapes
__init__.py
area.py
volume.py
shapes/area.py
PI = 3.14
# 원의 면적을 구해 주는 함수
def circle(radius):
return PI * radius * radius
# 정사각형의 면적을 구해 주는 함수
def square(length):
return length * length
shapes/volume.py
PI = 3.14
# 구의 부피를 구해 주는 함수
def sphere(radius):
return (4/3) * PI * radius * radius * radius
# 정육면체의 부피를 구해 주는 함수
def cube(length):
return length * length * length
import *
모듈을 임포트할 때 from <module> import *를 하면 모듈의 모든 내용이 임포트 됨
하지만 모듈 대신 패키지에 from <package> import *를 하면 패키지 안에 있는 것이 아무것도 임포트되지 않음
__all__ 특수 변수
__all__ 특수 변수는 우리가 import *를 했을 때 임포트 대상에서 어떤 것들을 가져와야 하는지를 정해주는 변수임, 임포트 대상에서 내용 전체를 가져오라고 했을 때 '전체'가 무엇인지 정의해주는 것임, __all__은 모듈에도 적용되고 패키지에도 적용됨
__all__과 모듈
모듈의 __all__은 모듈에 해당하는 파일에서 정의함, 예를 들어 area.py에 아래와 같은 코드를 추가해주면:
shapes/area.py
#__all__ 정의
__all__ = ['circle', 'square']
PI = 3.14
# 원의 면적을 구해 주는 함수
def circle(radius):
return PI * radius * radius
# 정사각형의 면적을 구해 주는 함수
def square(length):
return length * length
from shapes.area import *를 했을 때 area모듈의 모든 내용이 임포트 되지 않고 circle과 square 함수만 임포트 됨
__all__과 패키지
패키지의 __all__은 패키지에 해당하는 init 파일에서 정의함, 예를 들어 shapes 패키지의 init 파일에 아래와 같은 코드를 추가해 주면:
shapes/__init__.py
#__all__ 정의
__all__ = ['area', 'volume']
이제 from shapes import *를 하면 area모듈과 volume 모듈이 임포트됨
__all__을 사용하면 패키지나 모듈에 import *를 했을 때 어떤 것들이 임포트되는지를 제어할 수 있음, 그래도 여전히 import * 만 봐서는 정확히 어떤 것들이 임포트되는지를 알 수 없기 때문에 import *는 프로그램에서 정의되는 이름들, 즉 네임 스페이스를 완벽히 이해하고 있을 때만 사용하는 것을 추천함