안녕하세요. BlockDMask입니다.
오늘은 __name__ 전역 변수에 대해서 알아보려고 합니다.
지난 시간에 포스팅했던 모듈에 대해서 이미 알고 계시면 더 쉽게 이해하리라 생각이 듭니다.
<목차>
1. __name__ 전역 변수
2. __name__ 전역변수 사용 방법
1. 파이썬 __name__ 전역변수란?
1-1) __name__ 기본 설명
파이썬의 .py 파일에는 숨겨져 있는 변수가 하나 있습니다.
바로 __name__ 이라는 녀석입니다. 이 변수는 해당 모듈의 이름을 가지고 있는 변수입니다.
즉, 지금 py 파일의 이름을 가지고 있는 변수라는 것입니다.
example.py 면 example이라는 문자열을 __name__ 변수가 가지고 있게 되는 것입니다.
1-2) __name__, __main__? 이게 뭐야?
__name__에는 모듈의 이름이 들어가는데 들어가기도 하고 아니기도 합니다.
왜냐면. 메인으로 직접 실행한 파일의 경우에는 __name__에 파일 이름이 아닌 "__main__" 이라는 문자열이 들어가게 됩니다.
메인으로 직접 실행한 파일이라는 것을 구분하기 위해서입니다.
first.py, second.py 가 있다고 할 때
first.py에서 second.py를 import 해서 사용하고,
second.py에서도 first.py를 import 해서 사용한다고 했을 때
각자를 import 한다고 가정하면
first.py 를 기준으로 프로그램을 실행
first.py의 __name__은 "__main__" 이고, second.py의 __name__은 "second"가 들어가게 됩니다.
반대로 second.py를 기준으로 프로그램을 실행하면
first.py의 __name__은 "first" 이고, second.py의 __name__은 "__main__"이 됩니다.
정리하면,
직접 실행된 파일 __name__ == "__main__"
임포트 돼서 모듈로 사용된 .py 파일 __name__ == "모듈이름"
말로만 설명하니 어려운데 잠시 코드를 볼까요?
각 파일에 코드가 이렇게 존재한다고 하겠습니다. (편의상 하나의 텍스트 상자에 표시합니다.)
1-3) __name__ == __main__ 구분 예제
# first.py
import second # 모듈로 second 부르기
my_name = __name__
print(f"first.py : {my_name}")
# =================================
# second.py
my_name = __name__
print(f"second.py : {my_name}")
first.py에서 second.py를 임포트 해서 프로그램을 실행시켜 보겠습니다.
* first.py 를 메인으로 해서 프로그램을 실행시킨 결과
결과를 보면 import second를 이용해서 second 파일을 임포트 하는 것을 볼 수 있습니다.
파일을 임포트를 하게 되면 그 파일을 실행시킨다고 생각하면 되는데요. 파일을 실행시키기 때문에 print 함수도 동작을 하게 됩니다.
second.py : second 인 것을 보면 import 된 second.py 파일의 __name__ 에는 파일 이름(모듈 이름)이 들어간 것을 볼 수 있습니다.
반면에 메인으로 실행시킨 first.py 파일에서 __name__ 변수의 값은 first.py : __main__ 인 것을 볼 수 있습니다.
여기서 **꼭** 알아야 할 것은 두 가지인데요
(1) 파일이 임포트 될 때 해당 파일이 실행이 되는 것과 동일하다. (print 함수 같은 거 바로 출력됨)
(2) 메인으로 실행한 파일의 __name__에는 "__main__"이 들어간다.
* second.py를 메인으로 해서 프로그램을 실행시킨 결과
반대로 second.py 파일을 주 프로그램으로 실행을 시켜보겠습니다.
import 한 것도 없기 때문에 바로, second.py == __main__ 이라는것이 나오는 것을 볼 수 있습니다.
아까 전엔 다른 파일의 모듈로 사용되어서 __name__이 "second" 였던 것과는 달리
본인이 메인으로 프로그램이 실행되니 __name__이 "__main__"이 된 것을 볼 수 있습니다.
2. 파이썬 __name__ 예제
__name__이 주 프로그램인지 임포트 된 모듈인지에 따라서 이름이 변경하게 된 성질을 이용해서
우리는 중요한 것을 할 수 있습니다.
(1) 파일이 임포트 될 때 해당 파일이 실행이 되는 것과 동일하다. (print 함수 같은 거 바로 출력됨)
(2) 메인으로 실행한 파일의 __name__에는 "__main__"이 들어간다.
위에서 제가 강조했던 두 가지 특징에 대해서 살펴보면 이런 생각이 들 수 있습니다.
'그럼 파일에 print 같은 함수를 막 써놨는데, 나중에 다른 사람이 내 파일을 모듈로 사용하면 그냥 출력되겠네?'
이런 상황을 방지하고자 __name__ 이 있는 것입니다.
보통 if 문을 통해서 __name__ == "__main__" 인지 구분해서 "메인으로 실행되면 ~~~ 을 해라" 이런 식으로 프로그램을 작성합니다.
예제를 보면 x.py, y.py 라는 두 개의 파일이 있다고 가정하겠습니다. 순서대로 x.py, y.py 입니다.
# x.py
import y
result = y.getSum(8, 9, 10)
print(f"y.getSum(8, 9, 10) : {result}")
# y.py
def getSum(a, b, c):
return a + b + c
if __name__ == "__main__":
result = getSum(1, 2, 3)
print(f"getSum(1, 2, 3) : {result}")
- x.py 를 메인으로 해서 프로그램 실행
import y에 의해서 모듈로 사용된 y.py 파일이 실행되는데 if __name__ == "__main__" 에 의해서 __name__이 메인으로 실행되지 않아서 아래 print 문이 실행되지 않게 됩니다.
- y.py 를 메인으로 해서 프로그램 실행
y.py를 메인으로 해서 실행을 하니 __name__ == "__main__"이 True 가 되어서 아래 print 쪽 함수들이 수행된 것을 볼 수 있습니다.
이런 식으로 메인으로 쓰일 때, import 모듈로 사용될 때를 구분하기 위해서
if __name__ == "__main__" 을 이용해서 사용하면 됩니다.
감사합니다. 이상으로 __name__ 과 __main__ 에 대해서 알아보았습니다.
'<개인공부> > [Python]' 카테고리의 다른 글
[python] 파이썬 예외처리 try, except, else, finally 사용 방법 (0) | 2021.06.28 |
---|---|
[python] 파이썬 in, not in 포함 확인 연산 (0) | 2021.06.23 |
[python] 파이썬 숫자 확인, 알파벳 확인 isalpha, isdecimal (1) | 2021.06.22 |
[python] 파이썬 시간 측정, 프로그램 시간 측정 방법 (0) | 2021.06.21 |
[python] 파이썬 모듈 만드는법, 사용법 (0) | 2021.06.14 |
[python] 파이썬 리스트 중복 제거 방법 3가지 (0) | 2021.06.11 |
[python] 파이썬 ord 함수, chr 함수 설명과 예제 (0) | 2021.06.10 |
[python] 파이썬 클립보드, 복사, 붙여넣기 모듈 사용법 (2) | 2021.06.09 |