본문 바로가기
C.W.K.
Stream
Lesson 02 of 05 · published

패키지와 __init__·__main__

~18 min · package, __init__, __main__, namespace-package

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

일반 패키지는 __init__.py가 있는 모듈 디렉터리고, namespace 패키지는 여러 위치를 하나의 패키지로 묶으며 그 파일이 없을 수 있어.

패키지를 import하면 __init__이 실행돼. 안정된 공개 이름을 다시 내보낼 수 있지만 무거운 작업은 모든 import를 느리게 하고, 한번 올린 공개 경로는 내부를 옮겨도 지켜야 할 빚이 돼.

__main__.pypython -m package 진입점이고, __all__은 star import 공개 목록을 정해. 앞 밑줄은 내부 이름이라는 약속이지 접근을 막는 보안 장치가 아니야.

Code

작은 패키지의 파일 배치·python
# mypkg/
#   __init__.py
#   core.py
#   utils.py
#
# mypkg/__init__.py
# from .core import important_function   # 패키지 레벨 re-export
# __version__ = "1.0.0"
#
# mypkg/core.py
# def important_function():
#     return 42
#
# mypkg/utils.py
# def helper():
#     return "helped"

# 이제 호출자 가능:
# from mypkg import important_function   # __init__.py re-export 덕분에 작동
# from mypkg.utils import helper          # 항상 작동, 전체 path
# print(mypkg.__version__)
python -m으로 실행하는 __main__·python
# mypkg/__main__.py
# import sys
# from .core import important_function
#
# def main():
#     args = sys.argv[1:]
#     print("실행 with", args)
#     print("결과:", important_function())
#
# if __name__ == "__main__":
#     main()

# 부모 디렉토리에서 실행:
# python -m mypkg arg1 arg2
#
# 'python -m pytest', 'python -m http.server' 작동하는 방식.
__all__로 공개 이름 적기·python
# mymodule.py
# def public_func():
#     return "hi"
#
# def _internal():
#     return "export 안 됨"
#
# class Public:
#     pass
#
# class _Private:
#     pass
#
# __all__ = ["public_func", "Public"]
#
# 이제 `from mymodule import *` 가 public_func 와 Public 만 import.
# __all__ 없으면 어쨌든 public_func 와 Public 만 import
# (underscore 시작 안 하는 거), 명시적 __all__ 이 더 명확.
__init__ 없는 namespace 패키지·python
# 현대 Python (3.3+) 이 namespace 패키지 지원 — __init__.py 없이
# 패키지로 다뤄지는 디렉토리. 논리적 패키지가 여러 물리 디렉토리에
# 분산될 때 유용 (예 — 각 plugin 이 네임스페이스 일부 기여하는
# plugin 시스템).
#
# /path1/myorg/plugin_a/...
# /path2/myorg/plugin_b/...
#
# 어느 쪽도 __init__.py 없으면 둘 다 단일 'myorg' 네임스페이스 기여.
#
# 대부분 애플리케이션 코드엔 __init__.py 있는 regular 패키지가 OK +
# 의도 더 명확. namespace 패키지는 라이브러리/프레임워크 기능.

External links

Exercise

/tmp/calc_pkg에 __init__, core.py, __main__.py를 만들고 add를 패키지에서 다시 내보내. from calc_pkg import addpython -m calc_pkg 3 4가 모두 7을 내는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.