파이썬 프로그래밍을 하다보면 아래와 같은 문장을 만나곤 한다.
if __name__ = "__main__"
위의 문장을 이해하기 위해서는 파이썬의 namespace 라는 개념을 이해해야 한다. namespace를 얘기하기 전 파이썬에서 name(변수명)이 의미하는 것을 생각해 보자.
아래와 같이 파이썬에서는 name 에 값을 줄 수 있다. 그리고 값 값 뿐 아니라 function 과 같은 형태도 name을 줄 수 있다. 또한 동일한 name 을 재사용할 수 있다.
i = 12
s = "Hello World"
l = [1, 2, 3]
def foo()
print("This is a function")
f = foo
var = 12
var = "Hello world"
var = [1, 2, 3]
파이썬에서 names는 파이썬 객체 시스템과 함께 간다고 생각하면 된다. 즉 integer, string, list 및 function도 모두 파이썬에서는 객체 형태로 표현되고 name 은 그 객체에 접근하기 위해 사용한다.
namespace 와 module
namespace는 names를 담을 수 있는 공간이라고 생각하면 된다. 파이썬에서 namespace 를 이해하기 위해서 파이썬 모듈에 대한 약간의 이해가 필요하다. 파이썬에서 module 은 파이썬 코드를 담고 있는 파일이다. 해당 파일에서 파이썬 클래스, 함수 또는 단순하게 names의 리스트가 들어있을 수 있다.
각 모듈은 자신만의 유일한 namespace를 갖는다. (모듈의 namespace 이름은 보통 모듈의 파일이름과 같다.) 그래서 동일한 모듈내에서 동일한 이름을 가지는 클래스나 함수를 정의할 수 없다. 또한 모듈은 각각 완벽하게 독립적(isolated)이기 때문에(namespace 가 다르기 때문에), 두 모듈은 동일한 이름을 갖는 클래스나 함수를 정의할 수 있다.
import 와 namespace
import 명령을 가지고 namespace에 대해서 조금 더 알아보도록 하자. module 을 import 하는 방법은 여러가지가 있다. 방법에 따라 namespace가 달라 질 수가 있다.
1) import <module_name>
모듈을 import하는 가장 간단한 방법이고, 일반적으로 추천되는 방법이다. 이렇게 import를 하게 되면 module의 name을 prefix로 사용함으로써 모듈의 namespace에 접근할 수 있다.
import sys
sys.path
2) from <module_name> import <name,>
모듈의 namespace 에서 import 에서 지정된 name 들을 직접 가져오도록 한다. 이렇게 하게 되면 import 이후에 저장한 name 들은 module의 name을 prefix로 지정하지 않고도 접근이 가능하다. 하지만, 이 경우에 module 에서 import 된 이름과 main script 에서 지정된 이름이 동일한 경우, 나중에 정의되는 이름으로 대체되어서 이전 것에 접근이 불가능하게 된다.
단지 몇 개의 name 만 필요하다고 명확하게 알고 있는 경우에 사용하는 것이 유용하다.
from sys import path
path
3) from <module_name> import *
2와 동일하지만, module 에 있는 모든 name 을 직접 현재 namespace로 가져오게 된다. 이렇게 되면 namespace가 섞이게 되어서 일반적으로 사용을 권장하지 않는다. 차라리 첫번째 타입의 import를 사용하는 것이 좋다.
__main__ namespace
import가 아닌 파이선 인터프리터가 최초로 파일을 읽어서 실행하는 경우를 살펴보자. 파이썬 인터프리터는 소스파일을 읽고, 그 안의 모든 코드를 실행하게 되는데, 코드를 실행하기 전에 특정한 변수값을 정의한다. 그 중 하나가 __name__이라는 변수를 __main__ 으로 세팅한다.
즉 python script.py와 같이 직접 쉘에서 실행하는 경우에는 파이썬 인터프리터가 해당 script.py 모듈을 namespace가 아닌 __main__ 이라는 namespace로 간주하여 다루게 된다.
따라서 처음에 궁금했던 아래 문장은 '만일 이 파일이 인터프리터에 의해서 실행되는 경우라면' 이라는 의미를 갖는다.
if __name__ == "__main__"
즉 본이닝 구현한 코드가 다른 파이썬 코드에 의해서 모듈로 import 될 경우도 있을 수 잇고, 파이썬 인터프리터에 의해서 직접 실행될 경우도 있을 수 있는데, 위 코드는 인터프리터에 의해서 직접 실행될 경우에만 실행하도록 하고 싶은 코드 블럭에 있는 경우에 사용한다.
<code>
if __name__ == '__main__':
print "Thie program is being run by itself"
else:
print "I am being imported from another module"
<output>
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module