__name__ 그리고 '__main__'

우선 다음의 두 간단한 코드를 작성해서 실행시켜 봅시다.

#moduletest1.py
print('This is module Test')
#moduletest2.py
import moduletest1

위의 코드는 매우 단순합니다. moduletest1은 단순히 'This is module Test'를 출력하는 내용이며, moduletest2는 이러한 moduletest1을 거져왔을 (import) 뿐입니다. 그렇다면 여기서 moduletest2의 결과를 예측해 봅시다.

This is module Test

moduletest2는 그저 moduletest1을 가져왔을 뿐이지만, moduletest1의 내용이 수행되었습니다. 이것은 import된 순간 해당되는 내용이 수행된다는 것을 의미합니다.

#moduletest1.py
print('This is module Test')

print(__name__)

moduletest1에 4행과 같이 print(__name__)을 추가해보았습니다. __name__이라는 변수는 일종의 예약어로 특정 역할을 수행합니다. 이것이 추가되면 moduletest1에서 실행될 때와 moduletest2에서 실행될 때 결과가 다르게 나타납니다.

This is module Test
__main__

#moduletest1의 실행결과
This is module Test
moduletest1

#moduletest2의 실행결과

moduletest1으로 실행할 경우 moduletest1은 추가된 4행에 대해서 __main__이라는 결과를 보여줍니다. 하지만, mouletest2는 moduletest1이라고 출력합니다. 이것은 __name__이라는 예약어가 현재 코드가 실행되는 모듈의 위치를 반환하기 때문입니다. 실행이 시작되는 모듈과 실행이 되고 있는 모듈이 동일하다면 그저 '__main__'이라고 출력하지만, 다른 경우 실행되고 있는 모듈의 모듈명을 출력해 준 것입니다.

moduletest2는 import를 통하여 moduletest1을 실행하게 되었으나, 실행이 시작된 모듈이 moduletest2이므로 moduletest1의 print(__name__)을 실행할 때 moduletest1이라는 결과를 출력한 것입니다.

!!주의!! __name__은 예약어이기는 하지만, 변수입니다. 때문에 사용자가 얼마든지 해당 내용을 조작할 수 있습니다. 초기값은 실행되고 있는 모듈명에 과한 정보를 가지게 되지만, 얼마든지 사용자에 임의로 변경될 수도 있습니다.

예제

moduletest2에서도 print(__name__)를 추가하여 그 결과를 확인해 봅시다.

여기서 의문이 생길 수 있습니다. __name__의 역할은 알겠는데 그것이 무슨 의미가 있는지 말입니다. 그럼 아래와 같은 예제를 살펴보도록 하겠습니다.

#moduletest3.py

def normal_func(var_in1, var_in2):
    ret_var = 0
    if(var_in1 > var_in2):
        ret_var = var_in1 - var_in2
    else:
        ret_var = var_in2 - var_in1
    return ret_var

def normal_calc(var_in1= 0, var_in2 =1):
    ret_add = 0; ret_sub = 0; ret_mul =0; ret_div = 0

    ret_add = var_in1 + var_in2
    ret_sub = var_in1 - var_in2
    ret_mul = var_in1 * var_in2
    ret_div = var_in1 / var_in2
    return ret_add, ret_sub, ret_mul, ret_div

def variant_adder(*var_ins):
    var_tot = 0

    for cnt in var_ins:
        var_tot += cnt
    
    return var_tot

if __name__ == '__main__':
    var_ret = variant_adder(1,2,3,4,5,6,7,8,9)
    print(var_ret)

    var_ret = normal_calc(3.2, 4.1)
    print(var_ret)

위 코드는 moduletest3입니다. 이리 앞에서 함수 부분을 공부했기 때문에 우리는 위의 결과를 쉽게 유추할 수 있습니다. 만일 moduletest3를 실행한다면 variant_adder(1,2,3,4,5,6,7,8,9)와 normal_calc(3.2,4.1) 의 결과를 확인하게 됩니다.

#moduletest4.py

from moduletest3 import *

print(normal_func(1024, 256))
print(variant_adder(100, 100, 100))

moduletest4는 moduletest3를 import했습니다. 앞서 언급한 것과 같이 import 순간에 moduletest3는 실행되므로 variant_adder(1,2,3,4,5,6,7,8,9)와 normal_calc(3.2,4.1) 의 결과를 확인할 것이라고 예상할 수 있습니다. 하지만 moduletest3의 28행의 __name__ 은 '__main__'이 아니라 'moduletest3'이기 때문에 28행부터 33행의 내용은 출력되지 않습니다. 이것은 코드의 최초 실행 모듈과 현재 코드가 실행되는 모듈이 같지 않기 때문입니다. 이와 같은 코드 사용은 모듈의 재사용시에 원하지 않은 코드 진행을 차단하는 역할을 합니다.

Last updated