프로그래밍 언어/Python

Python 패키지 (Package)와 __init__.py

dpswlsldj 2021. 2. 28. 22:18
728x90

다른 언어와 마찬가지로 특정 기능을 하는 파일들끼리 모아놓은 것을 패키지라고 합니다. (ex. video, sound, network, motor, ETC)

1. Package 생성

프로젝트 우 클릭 -> New -> Python Package

 

저는 tistory라는 package를 생성하고 그 아래 post package, user package를 추가로 생성하였습니다.

그리고 각각 아래와 같이 파일을 생성하였습니다.

 

tistory/post/getpost.py

def getpost():
    return '1', 'hello'

tistory/user/getuser.py

def getuser():
    return 'kim'

2. Package 사용

main.py

import tistory.user.getuser
import tistory.post.getpost as get_post #get_post 는 alias

print(tistory.user.getuser.getuser())
print(get_post.getpost())

main.py 를 실행하면 결과를 얻을 수 있습니다.

 

아래와 같이 import하여 사용할 수도 있습니다.

from tistory.user.getuser import *
from tistory.post.getpost import *

print(getuser())
print(getpost())

3. 기타

패키지 생성 시 __init__.py 파일이 생성되는 것을 볼 수 있습니다.

 

이 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 합니다. PEP 420으로 인해 Python 3.3 버전 이후에는 __init__.py 파일이 없어도 패키지로 인식하지만 개발에 있어서 언제나 레거시를 무시할 수 없고 하위 호환을 위해 __init__.py 파일을 작성하는 것이 원칙이라고 합니다.

 

위의 예제를 조금 바꾸어 main.py 를 수정해 보겠습니다. 이렇게 수정하면 패키지를 import하여 동작이 될 것 같기도 한데 되지 않습니다.

from tistory.user import *
from tistory.post import *

print(getuser.getuser())
print(getpost.getpost())

이 때, 각 패키지 내의 __init__.py 파일에 각각 아래와 같이 내용을 추가해주면 됩니다.

 

패키지를 import * 할 때, __init__.py 파일 내의 __all__ 속성이 어떤 모듈들을 포함할지 선택한다는 의미입니다.

 

즉, import * 시, from이 모듈을 가리키는 경우 모든 함수를 import하지만 from이 패키지를 가리키는 경우 모든 모듈을 import하지는 않는다는 것입니다.

# tistory/post/__init__.py

__all__ = ['getpost']


# tistory/user/__init__.py

__all__ = ['getuser']