Python의 __name__ 특수 변수란?
다른 프로그래밍 언어와 달리 Python은 코드 실행을 명시적인 main 함수에서 시작하도록 설계되어 있지 않습니다. 대신 __name__이라는 특수 변수가 main 함수의 역할을 대신 수행합니다. __name__은 Python 언어에 내장된 변수이므로, 다음과 같이 간단한 프로그램을 작성하여 그 값을 직접 확인해 볼 수 있습니다.
print(type(__name__))
print(__name__)위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
<class 'str'>
__main__위 결과에서 알 수 있듯이 __name__ 변수의 값은 문자열(str) 데이터 타입이며, 스크립트를 직접 실행할 때는 __main__이라는 값을 가집니다.
__name__ 변수의 두 가지 핵심 특징
1. 독립 실행형 스크립트의 경우
다른 스크립트를 참조하지 않고 잘 작성된 독립 실행형 Python 스크립트를 실행하면, __name__ 변수의 값은 __main__과 같습니다.
이 특징을 설명하기 위해 standalone.py라는 이름의 프로그램을 작성해 보겠습니다.
def func1():
print('The value of __name__ is ' + __name__)
if __name__ == '__main__':
func1()위 코드를 실행하면 다음과 같은 결과를 얻습니다.
The value of __name__ is __main__예상대로 __name__ 변수는 __main__으로 평가되므로 위와 같은 출력이 나타납니다.
2. 스크립트를 임포트하는 경우
두 번째 특징은 하나의 Python 스크립트를 다른 스크립트로 임포트(import)하는 상황과 관련이 있습니다. 이런 경우 main() 함수로 간주할 수 있는 두 개의 서로 다른 스코프(scope)가 존재하게 됩니다. 첫 번째 스코프는 현재 실행 중인 프로그램의 __main__ 변수이고, 두 번째 스코프는 현재 프로그램에서 사용되는 임포트된 스크립트의 __main__ 변수입니다.
그렇다면 어떤 __main__ 변수가 사용될까요?
임포트한 스크립트의 함수를 실행하면, __name__ 변수는 __main__이 아니라 해당 스크립트의 실제 이름으로 평가됩니다.
반면 임포트한 스크립트를 참조하지 않고 현재 프로그램에서 name 변수의 값을 확인하면, 예상대로 __main__으로 평가됩니다. 이는 해당 위치가 들여쓰기 레벨 0, 즉 프로그램의 최상위 스코프이기 때문입니다.
아래 프로그램이 이 예시를 보여줍니다.
예제
import standalone as sa
print('Running the imported script')
sa.func1()
print('\n')
print('Running the current script')
print('The value of __name__ is ' + __name__)출력 결과
위 코드를 실행하면 다음과 같은 결과를 얻습니다.
Running the imported script
The value of __name__ is standalone
Running the current script
The value of __name__ is __main__if __name__ == "__main__" 패턴의 유용성
이 접근 방식의 진가는 if __name__ == "__main__": 구문을 사용할 때 드러납니다. Python 인터프리터는 이 조건문을 통해 현재 실행 중인 스크립트를 해석하고 있는지, 아니면 외부 스크립트를 임시로 해석하고 있는지를 판단합니다. 이를 통해 프로그래머는 상황에 따라 외부 스크립트의 코드와 현재 실행 중인 스크립트의 코드 중 무엇을 실행할지 선택할 수 있으며, 결과적으로 프로그램의 각 부분이 어떻게 동작할지 세밀하게 제어할 수 있습니다.