다른 .py파일을 import 하는 방법과 __name__의 정체

2019. 8. 17. 16:00Programming Tutorial/Python

우리가 꽤 큰 파이썬 프로젝트의 일원이라고 생각해봅시다.

 

당연히 파이썬 스크립트 파일은 하나가 아닐거고, xxx.py 라는 스크립트 안에 이미 개발되어있는 함수를 yyy.py라는 파일에서 사용하고 싶어질수도 있을 것입니다. 그럼 그때 복붙하는 것은 너무 비효율적이겠지요.

 

이러한 필요성으로 다른 스크립트로부터 파이썬코드를 import 할수 있습니다. 

 

만약에 현재 작업중인 폴더에 import하고 싶은 파이썬 스크립트가 있다면, 단순히 아래와 같이

import 뒤에 파일명을 확장자 없이 써주는 것만으로 import행위를 할수 있습니다. 

 

단순하지요?

 

import useful_functions

보통 위와 같은 import는 파일의 제일위에 적으며, 한줄에 하나씩 나눠 적는게 약속입니다.

 

이제 import한 useful_functions를 어떻게 이용할지 봅시다.

import useful_functions
useful_functions.add_five([1, 2, 3, 4])

import 된 module의 object에 접근하기 위해서는 위와 같이 dot notation을 통해 접근해야 합니다.

 

아하.. 그런데 import 뒤에 파일명이나 모듈명인 이 글이 길면 길어질수록 타이핑 압박이 오겠군요.

 

일전에도 익히 알다시피 as (alias) 를 통해서  

import useful_functions as uf
uf.add_five([1, 2, 3, 4])

위와 같이 해결이 가능합니다. 예전에 언급된 내용이군요.

 

아래와 같은 경우도 생각해봅시다.

 

useful_functions.py 이라는 파일을 가져다가 다른 작성중인 스크립트에 가져다쓰는 방법을 몇가지 봤지만 반대로 가져가짐 당하는 이 완성된 스크립트의 내용이 아래와 같다면요.

# useful_functions.py

def mean(num_list):
    return sum(num_list) / len(num_list)

def add_five(num_list):
    return [n + 5 for n in num_list]

print("Testing mean function")
n_list = [34, 44, 23, 46, 12, 24]
correct_mean = 30.5
assert(mean(n_list) == correct_mean)

print("Testing add_five function")
correct_list = [39, 49, 28, 51, 17, 29]
assert(add_five(n_list) == correct_list)

print("All tests passed!")

정의된 함수아래에 테스트용 코드가 삽입되어 있군요.

 

실제로 이렇게 해당 스크립트만 단일로 사용했을때 실행할 코드들을 해놓으면...

 

mean함수를 다른 스크립트에서 가져다 쓰든 add_five 함수를 다른 스크립에서 가져다 쓰든..

 

접근 할때마다 아래의 Test용 코드도 다른 스크립트에서 같이 실행되게 됩니다.

 

 

 

이러한 것들을 막고자 main block을 사용하는 예시를 같이 보도록 합시다.

 

일단 위의 Test 코드를 main이라는 함수를 만들고 그 block안에 표현되도록 합시다.

이렇게 하면 다른 함수가 실행될때 중복 실행되는 만행은 없어질 것입니다.

 

그럼 Test 할때는?? 아래와 같은 표현으로 if __name__ == "__maiin__" 표현으로 해결 가능합니다.

종합적으로 아래 예시 보고 가실게요.

 

# useful_functions.py

def mean(num_list):
    return sum(num_list) / len(num_list)

def add_five(num_list):
    return [n + 5 for n in num_list]

def main():
    print("Testing mean function")
    n_list = [34, 44, 23, 46, 12, 24]
    correct_mean = 30.5
    assert(mean(n_list) == correct_mean)

    print("Testing add_five function")
    correct_list = [39, 49, 28, 51, 17, 29]
    assert(add_five(n_list) == correct_list)

    print("All tests passed!")

if __name__ == '__main__':
    main()

__name__이라는 built-in value에 대해서 설명이 있어야겠네요. 

파이썬 스크립트가 실행될때 자동으로 __name__이라는 변수는 해당 모듈이 main인지 아닌지 판단하여

변수값을 __main__ 으로 바꿔줍니다.

그래서 userful_fuctions.py 를 main으로 Test해보는 코드를 돌릴때는 

if문 작동으로 main함수를 실행해볼수 있는 거죠.

 

아래 demo.py 코드로 확인해볼수 있으실 겁니다.

# demo.py

import useful_functions as uf

scores = [88, 92, 79, 93, 85]

mean = uf.mean(scores)
curved = uf.add_five(scores)

mean_c = uf.mean(curved)

print("Scores:", scores)
print("Original Mean:", mean, " New Mean:", mean_c)

print(__name__)
print(uf.__name__)

 

날씨가 많이 덥고 습한데.. 뜨거운 여름도 얼마 남지 않은 것 같습니다. 

 

즐코 합시다.