패키지 = 모듈 디렉토리
디렉토리가 __init__.py (regular 패키지) 포함하거나 namespace 패키지 룰 (3.3+, __init__.py 불필요) 따르면 Python 패키지 됨. 패키지 안 — 파일이 *모듈*, 서브디렉토리가 *서브패키지*. 전체 트리가 한 import 가능 네임스페이스로 동작.
__init__.py — 패키지 setup
mypkg import 하면 Python 이 mypkg/__init__.py 실행. 사용 — (a) 핵심 이름 re-export 해서 호출자가 from mypkg.submodule import Important 대신 from mypkg import Important 가능, (b) 패키지 전반 setup, (c) __version__ 정의. 작게 유지 — __init__ 의 무거운 작업이 모든 import 느리게.
__main__.py — 패키지를 실행 가능하게
패키지 상단에 __main__.py 추가 + python -m mypkg 로 실행 가능. 패키지로 ship 되는 CLI 도구에 유용. python -m pytest, python -m http.server 가 작동하는 이유도 이 패턴.
__all__ — wildcard import 제어
모듈이 __all__ = ["Foo", "bar"] 정의하면 from module import * 가 그 이름들만 import. __all__ 없으면 모든 public 이름 (앞 underscore 없는) export. public API 가 뭔지 공식화하고 싶을 때 유용.
_private) 가진 이름은 컨벤션상 내부 — 언어 강제 X 지만 도구와 사람이 존중. 호출자가 의존하면 안 되는 거에 예약. public 이름은 from mypkg import name 에 잘 읽히게 명명.