Module Level이란
한 줄 정의
파일을 import하는 순간 바로 실행되는 코드.
개념
Python은 파일을 import할 때 위에서 아래로 전부 실행한다. 함수/클래스 정의도 "실행"이고, 그냥 떠있는 코드도 다 실행된다.
# mymodule.py
import os # ← module level: import 순간 실행
DB_URL = "localhost:5432" # ← module level: 상수 정의
logger = setup_logger() # ← module level: 함수 호출도 실행됨
class MyClass: # ← module level: 클래스 정의 (실행)
pass
def my_func(): # ← module level: 함수 정의 (실행)
... # 단, 함수 내부는 호출 전까지 안 실행
if __name__ == "__main__": # ← 직접 실행할 때만
...
if __name__ == "__main__"과의 차이
| | module level | __main__ 블록 |
|---|---|---|
| 실행 시점 | import 순간 | python mymodule.py로 직접 실행할 때만 |
| 용도 | 항상 필요한 초기화 | 스크립트 진입점 |
what-to-centralize-imports|loguru 설정, DB 연결 같은 걸 module level에 두는 이유가 여기 있다. "이 모듈을 쓰는 누구든 이 초기화가 필요하니까"라는 의도.
주의: 부작용 있는 코드
module level에 부작용 있는 코드를 두면 import만 해도 실행돼서 테스트나 다른 곳에서 쓸 때 예상치 못한 동작이 생길 수 있다.
# 나쁜 예
send_email("서버 시작됨") # import만 해도 메일 날아감 💀
# 좋은 예
def start():
send_email("서버 시작됨") # 명시적으로 호출할 때만