Python 관련 책이나 코드를 보면 이런 코드를 종종 볼 수 있습니다.
if __name__ == '__main__':
이번 포스팅에서는 이 코드의 의미가 무엇이고 왜 있어야 하는지 알아 보겠습니다.
간단하게 코드로 예를 들어 하나씩 정리해보면
먼저 Python 모듈을 실행하면 아무것도 안해줘도 __name__에 __main__이라는 값이 들어갑니다.
pizza.py
print('pizza1')
print('__name__ ', __name__)
print('pizza2')
실행하면 다음과 같은 결과가 나옵니다.
pizza1
__name__ __main__
pizza2
그럼 다른 모듈에서 import를 통해 pizza.py를 가져오면 __name__에는 뭐가 들어갈까요?
이번에는 chief라는 모듈을 만들어 실행해보겠습니다.
chief.py
import pizza
print('chief1')
print('__name__ ', __name__)
print('chief2')
그럼 다음과 같은 결과가 나옵니다.
pizza1
__name__ pizza
pizza2
chief1
__name__ __main__
chief2
여기서 알 수 있는 사실은 두가지입니다.
1.import pizza
import pizza를 하면 이것 자체로 pizza.py가 한 번 실행됩니다.
다른거 아무것도 안해도 그냥 한번 실행됩니다.
2.__name__
pizza.py를 실행할 때는 __name__값이 __main__이었습니다.
하지만 다른 모듈을 통해 호출될 때는 __name__값이 pizza입니다.
Python 모듈이 시작점일 때는 __name__값이 __main__이지만
다른 모듈에서 호출될 때는 __name__값이 Python 모듈명입니다.
그럼 이 코드를 넣는 이유는 무엇일까요?
if __name__ == '__main__':
바로 해당 파일이 시작점일 때만 실행하도록 만들고 싶어서 입니다.
무슨 말이냐면 예시를 조금 바꿔서
calculator.py
def add(a, b):
return a+b
def divide(a, b):
return a/b
a = add(5, 3)
print(a)
b = divide(4, 2)
print(b)
calculator라는 모듈을 만들어 함수를 정의해놓고 잘 실행되나 테스트해봤습니다. 잘 됩니다.
그 다음 다른 모듈에서 calculator를 사용하기 위해 import했다고 해보겠습니다.
student.py
import calculator
c = calculator.add(10, 3)
print(c)
실행 결과는 엉뚱합니다.
8
2.0
13
왜냐면 import calculator를 하는 순간 calculator.py가 한 번 실행되기 때문입니다.
이렇게 다른 모듈에 의해 import될 때 무조건 한 번 실행되는 경우를 막기 위해 아래 코드를 사용합니다.
if __name__ == '__main__':
calculator.py 코드를 조금 바꿔 보겠습니다.
def add(a, b):
return a+b
def divide(a, b):
return a/b
if __name__ == '__main__':
a = add(5, 3)
print(a)
b = divide(4, 2)
print(b)
이렇게 바꾸면 if 절 밑에 코드는 오로지 calculator.py에 __name__이 __main__인 경우
즉, 다른 모듈이 calculator.py를 호출할 때 말고
시작점이 calculator.py인 경우에만 실행되어 의도치 않은 결과를 막을 수 있도록 합니다.
'파이썬 > 기초문법' 카테고리의 다른 글
Python 언더스코어(_)와 더블언더스코어(__) 비교 (0) | 2020.05.04 |
---|---|
Python 인터프리터 vs 컴파일러 / Is Python interpreted or compiled? Yes 번역 (0) | 2020.04.20 |
Python namespace에 대한 이해 / Python 네임스페이스 (0) | 2020.04.15 |
Python First Class Function 일급 함수 (0) | 2020.04.09 |
Python Mutable vs Immutable / Mutable / Immutable (0) | 2020.03.16 |
댓글