새로운 파이썬 파일을 생성하면 아래와 같은 파일을 한 번쯤은 봤을 것이다.

def main()
  print("hello world)

if __name__ == "__main__":
  main()

해당 형식을 봤다면 당연히 __name__ 이 무엇인지에서 공부를 시작해야 하지 않을까?? 이를 이해하기 위해서 namespace 에 대해서 살펴보아야한다.

NameSpace

네임스페이스란 특정한 객체를 이름에 따라 구분할 수 있는 범위를 말한다. 프로그래밍 중 변수나 함수의 이름을 정하는 경우에 시스템이 커진다면 충돌이 일어날 수 밖에 없다. 이를 해결하기 위해서 Java 에서는 패키지를 사용하고 Python 에서는 namespace 를 사용한다고 생각할 수 있다.

파이썬의 네임스페이스는 크게 세 가지로 분류한다.

  • 전역 네임 스페이스 : 모듈별로 존재하며, 모듈 전체에 통용되는 이름을 사용한다.
  • 지역 네임 스페이스 : 함수 및 메소드 별로 존재하며, 함수 내의 지역 변수들이 소속된다.
  • 빌트인 네임 스페이스 : 기본 내장 함수 및 기본 예외들의 이름을 저장하는 곳

Scope

전역 변수와 지역 변수의 특징과 동일하게 전역 네임스페이스와 지역 네임스페이스도 스코프가 존재한다. 아래 예시를 살펴보자.

def func1():
    a = 20
    def func2():
        a = 30
        print(locals())

    func2()
    print(locals())

a = 10
func1()
print(locals())

//{'a': 30}
//{'a': 20, 'func2': <function func1.<locals>.func2 at //0x100d28940>}
//{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x100c38ca0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/min/Desktop/desk/Algorithm/b.py', '__cached__': None, 'func1': <function func1 at 0x100c841f0>, 'a': 10}


파이썬 인터프리터는 먼저 Level 0 코드부터 실행한다. def 부분은 정의만 하고 실행하지 않으며 “a = 10” 이 가장 먼저 실행된다. 이후 func1 이 실행되며 동일하게 “a = 20” 이 실행되어 지역 네임스페이스에 저장된다. 동시에 func2 가 실행되며 정의 되어있던 def 부분도 지역 네임스페이스를 거치게 된다. 이후 func2 도 동일하게 “a = 30” 을 자신의 지역 네임스페이스에 저장한다.

실제 locals() 를 출력한 결과를 본다면 더 명확하게 이해할 수 있다. func2 에서는 a 에 30이 저장되어있다. func1 에서는 a 에 20이 저장되어있으며 func2 도 저장되어있다. 이후 마지막에서는 a 에 10 이 저장되어있다.또한 우리가 찾던 “__name__” 에 대한 정보도 들어있다. 이를 통해 다음을 유추할 수 있다.

모듈 전체에서의 지역 네임스페이스는 모듈의 전역 네임스페이스와 동일하며 이를 locals(), globals() 를 출력해 확인할 수 있다!

__main__

이제 가장 처음의 질문으로 되돌아가게 된다.

if __name__ == ‘__main__’:

위 코드에서 __name__ 은 현재 모듈의 이름을 담고 있는 내장 변수이며 전역 네임스페이스이다. 파이썬에서는 해당 모듈이 직접 실행되는 경우에만 전역 네임스페이스에서 __name__ 가 ‘__main__’ 로 설정된다.

따라서 해당 코드가 다른 모듈에 의해 import 되어 실행되는 경우에는 __name__ != ‘__main__’ 이므로 if 문이 실행되지 않는다.

즉 한마디로 현재 모듈이 직접 실행되는 경우에 if 문 이하를 실행하라는 뜻이다.

업데이트:

댓글남기기