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 방식을 권장.