init import 용법
init.py 에 import
- 결론: 현 소규모 프로젝트에서는 암시적 import 시도.
1. 장점
1.1. 간결한 모듈 사용
하위 모듈에 직접 접근하지 않고도 상위 패키지에서 바로 사용할 수 있음.
예:
# src/logger/__init__.py
from .base_logger import Logger
__all__ = [
'Logger'
]
# src/main.py
from logger import Logger
- 하위 모듈 경로를 신경 쓰지 않아도 되므로 코드가 간결해짐.
1.2. 일관된 인터페이스 제공
패키지의 API처럼 동작하며, 사용자가 모듈 구조를 몰라도 쉽게 사용할 수 있음.
예:
mypackage.func1처럼 간단하게 사용 가능.
1.3. 코드 유지보수 편리
- 외부 코드에서 각 하위 모듈을 수정할 필요 없이,
__init__.py를 통해 패키지 인터페이스를 일관되게 변경할 수 있음.
1.4. 가독성 향상
상위 수준의 주요 기능만 노출하도록 설계 가능.
불필요한 내부 모듈이나 구현 세부사항을 숨김.
2. 단점
2.1. 불필요한 메모리 및 초기 로드 시간 증가
__init__.py에서 import된 모든 모듈이 패키지가 처음 import될 때 로드됨.사용하지 않는 모듈까지 로드되면 메모리 낭비 및 성능 저하 발생.
2.2. 모듈 간 순환 참조 문제
하위 모듈끼리 서로 import하다가
__init__.py를 통해 다시 import되면 순환 참조 문제가 발생할 가능성.복잡한 구조에서는 디버깅이 어려워질 수 있음.
2.3. 모듈 경로 가독성 저하
명시적 import를 선호하는 경우,
__init__.py에 모든 import를 숨기면 경로를 추적하기 어렵고 디버깅이 불편.예:
# 어디에서 func1이 import되었는지 알기 어려움
from mypackage import func1
2.4. 동적 로딩 어려움
- 일부 하위 모듈만 동적으로 import해야 할 경우,
__init__.py에 모든 것을 import하면 비효율적.
3. 사용 시 고려사항
3.1. 작은 패키지
import 미리 설정은 유용.
주요 함수/클래스를 모듈 단위로 공개하면 사용자 경험이 좋아짐.
3.2. 대규모 패키지
불필요한 import를 피하고, 명시적 import 방식을 유지하는 것이 좋음.
필요에 따라 하위 모듈에서 직접 가져오는 방식 권장:
from mypackage.submodule import specific_function
3.3. 명시적 vs 암시적 접근
명시적 import: 가독성 및 유지보수 용이.
암시적 import: 사용자 입장에서 편리.
4. 최종 요약 (장단점 비교 표)
| 항목 | 장점 | 단점 |
| — | — | — |
| 사용 편의성 | 상위 모듈에서 간단히 접근 가능 | 내부 구조 파악 어려움 |
| 로드 시간 및 메모리 | 인터페이스 노출로 생산성 향상 | 불필요한 로드로 메모리 낭비 |
| 코드 관리 | 패키지 일관성 제공 | 복잡한 구조에서 순환 참조 위험 |
| 규모 | 작은 패키지에서 적합 | 대규모 패키지에서는 성능 저하 가능성 |
5. 추천 방법
작은 패키지: 주요 함수/클래스를
__init__.py에서 import하여 간결한 API 제공.대규모 패키지:
__init__.py에 불필요한 import 최소화, 명시적 import 방식을 권장.