ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • if __name__ = ""__main__: 의미!
    Python & Flask & Django 2017. 1. 19. 00:06



    파이썬 프로그래밍을 하다보면 아래와 같은 문장을 만나곤 한다.


    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




    'Python & Flask & Django' 카테고리의 다른 글

    SQLAlchemy Tutorial  (0) 2017.02.02
    SQLAlchemy 시작하기 - Part 2  (0) 2017.02.01
    SQLAlchemy 시작하기 - Part 1  (0) 2017.01.31
    Python public, private, protected  (0) 2017.01.25
    WSGI (Web Server Gateway Interface)  (0) 2017.01.19
Designed by Tistory.