Python 소스코드를 보면 module(.py 파일) 내부에
if __name__ == "__main__": 이라는 구문을 많이 볼 수 있다.
Python 문법을 알고, 함수도 어느정도 작성할 수 있는 나에게 위의 구문은 보기만해도
낯선 것에 의한 강한 거부감이 든다...
하지만 프로젝트를 진행하는 과정에서 이 문법을 포함한 몇 가지의 문법들은 몰라서는 소스코드를 한참을 봐도 이해가 안되고,
사용할 때 마다 기술 부채를 느끼기 때문에 이번 기회에 제대로 뜯어보며 정리하려고 한다.
딱 나와 같은 수준을 가진 Python 사용자가 있다면 이 글이 도움이 되었으면 좋겠다.
< 가정 >
1. test.py 와 exam.py 이 있음
2. exam.py 에서 test 를 import 한다. (import test)
1. __name__ , __main__ 이란?
__name__ : 모듈의 이름을 담고 있는 파이썬 내장 변수, test.py 라는 파일에서 확장자 .py를 제외한 test가 모듈의 이름
__main__ : 최상위 코드가 실행되는 환경의 이름. 실행을 시작하는 첫 번째 Python 모듈
__main__ 의 이해가 어려울 듯 하여 다음의 예시를 참고
1-1) 간단한 예
# test.py 에서 다음을 작성 후 test.py 에서 실행
print('__name__ value :', __name__)
__name__ value : __main__
(import 없이 test.py 에서 실행을 했기 때문에 최상위 코드에서 실행한 것 __name__ = __main__)
# 위의 test.py 수정없이 작성
# exam.py 에서 다음을 작성 후 exam.py 에서 실행
import test
print('__name__ value :', __name__)
__name__ value : test
__name__ value : __main__
(import test 를 했으므로 test.py 에 있는 print() 가 실행되는데 이때 exam.py 입장에서 모듈의 이름은 test 이다.
이후 exam.py 에 있는 print() 가 실행되는데, exam.py 입장에서 모듈의 이름은 __main__ 이다. (최상위 코드 환경, exam 아님 주의)
따라서 exam.py 에서 실행을 하면 test.py 모듈을 가져온 것에서 1번 실행, exam.py 에서 1번 실행 하여 총 2회 실행된다.
2. 왜 사용하는가?
위의 예에서 exam.py 에서 test를 import 할 때, test.py 에 있는 명령어가 실행되는 것을 보았다.
만일, test.py 에 있는 명령어가 실행되는 것을 원치 않을 경우, if __name__ == "__main__": 을 추가하여 막을 수 있다.
3. 모든 경우의 예시
필자는 스스로 다음 코드를 돌려보면서 과정을 이해를 했다.
<가정>에서 나올 수 있는 경우는 총 4개이다.
작성의 편의를 위해 if __name__ == "__main__": 를 A 라고 치환하면 아래의 4경우가 존재한다.
(모든 실행은 exam.py 에서 진행된다.)
- test.py + exam.py 모두 A 가 없는 경우
- test.py 에는 A 가 있지만, exam.py 에는 A 가 없는 경우
- test.py 에는 A 가 없고, exam.py 에는 A 가 있는 경우
- test.py + exam.py 모두 A 가 있는 경우
3-1) test.py + exam.py 모두 A 가 없는 경우
# test.py 에서 작성
print('__name__ value :', __name__)
# exam.py 에서 작성
import test
print('__name__ value :', __name__)
__name__ value : test
__name__ value : __main__
3-2) test.py 에는 A 가 있지만, exam.py 에는 A 가 없는 경우
# test.py 에서 작성
if __name__ == "__main__":
print('__name__ value :', __name__)
# exam.py 에서 작성
import test
print('__name__ value :', __name__)
__name__ value : __main__ (test 가 모듈이름 이므로 첫 if 문 실행 X)
3-3) test.py 에는 A 가 없고, exam.py 에는 A 가 있는 경우
# test.py 에서 작성
print('__name__ value :', __name__)
# exam.py 에서 작성
import test
if __name__ == "__main__":
print('__name__ value :', __name__)
__name__ value : test
__name__ value : __main__
(3-1 과 동일)
3-4) test.py + exam.py 모두 A 가 있는 경우
# test.py 에서 작성
if __name__ == "__main__":
print('__name__ value :', __name__)
# exam.py 에서 작성
import test
if __name__ == "__main__":
print('__name__ value :', __name__)
__name__ value : __main__
(3-2 와 동일)
4. 마치며
3)의 결과로부터
사실상 작성하는 모듈이 import 될 여지가 없다면 if __name__ == "__main__": 구문은 필요없다.
그 이유를 답할 수 있다면 이 process를 완벽하게 숙지 했다고 생각할 수 있다.
이제 우리는 module 단위로 함수를 작성하는 등. 효율적인 Python 프로그래밍을 할 수 있게 되었다. 복잡한 프로젝트에 도전해보자.
잘못된 정보가 있으면 피드백 주세요 감사히 수정하겠습니다.
'✍🏻Language & FrameWork > Python' 카테고리의 다른 글
[Python] Class, __init__ (0) | 2024.01.20 |
---|---|
[Python for ML] Numpy - 1 (2) | 2024.01.08 |
[Python for ML] Linear Algebra Codes - 2 (2) | 2024.01.04 |
[Python for ML] News Categorization (0) | 2024.01.02 |
[Python for ML] Linear Algebra Codes - 1 (2) | 2024.01.02 |