패키지 내의 여러 모듈에서 공통적으로 쓰이는 변수가 있다면 (예를 들어 shapes 내의 area, volume ... 등에서 쓰이는 PI 변수) 그 변수는 각각의 모듈 내에서 매번 정의하기보다 init 파일에서 한 번 정의해 준 후에 각각의 모듈에서는 import해주기만 하는 게 더 효율적이고 실수를 줄일 수 있는 방법이다.
init.py
PI = 3.14
from shapes import area, volume
area.py
from shapes import PI
def circle(radius):
return PI * radius * radius
def square(length):
return length * length
이런 식으로 말이다.
*(스타)를 통해 패키지 내의 모든 모듈을 import하려고 하면 제대로 되지 않는다.
run.py
from shapes import *
이것은 패키지에서 all 특수변수가 정의되지 않았기 때문이다. 해결하려면
init.py
__all__ = ['area', 'volume']
PI = 3.14
from shapes import area, volume
이런 식으로 init 파일에서 미리 all을 정의해 줘야 한다.
마찬가지로 모듈 내에서도 all을 정의할 수 있다. 그러면 from (모듈이름) import * 이런 식의 문법을 사용했을 때 그 모듈 내의 어떤 변수, 어떤 함수, 어떤 클래스들을 import할 것인지 정의할 수 있다.
# 패키지 임포트
import mymath
# 서브패키지 임포트
import mymath.shapes
# 모듈 임포트
import mymath.shapes.area
# 모듈 안에 있는 변수나 함수는 이 방식으로 임포트 할 수 없음
import mymath.shapes.area.circle # 오류
이 방식으로 import 했을 때는 사용하기 위해서 import에 썼던 그대로 사용해야 한다.
mymath.shapes.area.circle(3)
# 패키지 안에 있는 패키지 임포트
from mymath import shapes
# 패키지 안에 있는 모듈 임포트
from mymath.shapes import area
# 모듈 안에 있는 함수 임포트
from mymath.shapes.area import circle
# import 뒤에는 . 을 쓸 수 없음
from mymath import shapes.area # 오류
상대경로는 항상 . 아니면 ..으로 시작한다. '.'은 현재 파일이 위치한 디렉토리를 의미하고 '..'은 현재 파일이 위치한 디렉토리보다 한 단계 더 높은 상위 디렉토리를 의미한다.