파이썬에서 __init__.py는?
파이썬 프로젝트 파일들을 들여다 보면, 심심치 않게 발견할 수 있는 이상한 파일들이 있습니다.
__init__.py 라는 녀석인데요.
막상 파일들의 크기를 보면, 0 bytes이고 내용도 비어 있습니다.
이런 파일들이 왜 필요할까요?
하위 호환성
파이썬 3.x 최신 버전에서는 이 파일이 없어도 된다고 하지만, 하위 버전 호환성을 위해서라도 __init__.py 파일은 유지하는 것이 좋아 보입니다.
$ touch __init__.py
와 같이, 해당 디렉토리에 빈 파일을 만들어 두기만 하면 됩니다.
__init__.py의 임무
패키지 구분자
__init__.py는 해당 디렉토리를 모듈로 인식하게 만들어 줍니다.
파이썬 프로젝트를 수행하면서, 단일 파일로 모든 기능을 개발하는 경우도 있긴 하겠지만, 재사용성이나 확장성 등 목적을 위해 모듈화를 위해서는 꼭 필요하다고 생각하면 되겠습니다.
main.py
ㄴ mymodule
ㄴ __init__.py
ㄴ submodule.py
ㄴ util.py
위와 같은 구조를 갖추고 있다고 합시다.
main 모듈에서 mymodule에 작성되어 있는 util이나 submodule내 function을 참조하는 경우가 있겠죠?
__init__.py가 없다면, 위와 같은 패키지 기반의 접근이 되지 않습니다.
자바에서처럼 패키지로 접근하게 해주려면, __init__.py 파일을 만들어 주면 됩니다.
초기화 코드
파이썬 패키지가 초기화 되면, __init__.py의 내용이 함께 실행됩니다. 따라서, 패키지 레벨의 초기화 코드를 이 파일내에 작성해 두면, 관리성/ 가시성/ 효율성 관점에서 도움이 됩니다.
네임스페이스 관리
여러 라이브러리를 여러 파일에서 작성하다보면, 네임스페이스가 복잡해지고 이를 반복적으로 다른 파일에서 매번 수행해야하는 번거로움이 생길 수 있습니다. 이를 패키지내에서 네임스페이스를 정리해준다면 보다 편리하고 깔끔하게 관리할 수 있습니다.
from long_package import get_data
from another_long_package import aggregate_data
__all__ = ['get_data', 'aggregate_data']
등과 같이 정리해 줄 수 있습니다. 위의 코드는 alias까지 지정한다면 아래와 같이도 쓸 수 있습니다.
from long_package import get_data as get
from another_long_package import aggregate_data as aggregate
__all__ = ['get', 'aggregate']
패키지 함수 작성
단순히 빈 파일로 두는 것을 넘어, 패키지 내에서 사용하는 공통 함수를 작성할 수도 있습니다. 패키지내에서 공통으로 사용되는 편의 함수를 저장하는 공간으로도 활용할 수 있습니다.