코드를 작성하다보면 다른 사람들이 기존에 만들어놓은 코드를 사용하고 싶을 수도 있습니다. 또는, 이전에 다른 프로젝트에서 내가 사용한 코드들의 모임이 필요할 때도 있습니다. 이 때 사용하는 것이 모듈입니다. 모듈의 정의는 함수나 변수 또는 클래스를 모아놓은 파이썬 파일입니다.
① 모듈 불러오기
import 키워드를 이용해서 모듈을 사용할 수 있습니다. 모듈 속에 있는 함수/변수를 사용하는 방법은 모듈명 뒤에 .을 쓴 후에 함수명/변수명을 쓰면 됩니다.
import random # random 모듈 불러오기
print(random.randrange(1, 9)) # random 모듈에서 randrange 함수 사용
② 모듈 만들기
나만의 모듈을 만드는 것은 파이썬 파일(확장자명 py)을 만드는 것과 동일합니다. 그 다음엔 다른 모듈들을 사용할 때와 동일하게 import 키워드를 통해 모듈을 불러오면 됩니다. 파일명에 확장자명이 붙어있다고 해서 "import 모듈명.py"로 입력하면 안되고 "import 모듈"로 입력해야 합니다. 단, 모듈이 같은 디렉터리에 있지 않다면 모듈이 설치된 리스트 목록(sys.path)에 모듈이 존재하는 디렉터리를 추가로 저장해야 합니다.
③ if __name__ == "__main__": 의 의미
만약 모듈에 함수나 변수의 정의 부분 외에 실행하는 코드가 있다고 가정합시다. 이때 import를 사용해 모듈을 불러오면 모듈 불러오기만 되는 것이 아니라 모듈이 파이썬 파일로 인식되어 코드들이 실행되어 버립니다. 이러한 문제를 방지하기 위해서는 실행될 코드 앞에 if __name__ == "__main__"을 사용하면 됩니다. 이 코드는 "이 파일이 모듈이 아닌 직접 파일처럼 실행했을 때만"을 뜻합니다. 따라서 대화형 인터프리터나 다른 파일에서 모듈을 불러서 사용할 때는 __name__ == "__main__"가 거짓이 되어 이 코드에 포함된 코드 블럭이 실행되지 않습니다.
# module1.py
def add(a, b) :
return a+b
def sub(a, b) :
return a-b
if __name__ == "__main__":
print(add(1, 4))
print(sub(4, 2))
여러 모듈들이 사용되고, 이 모듈들을 폴더에 넣어서 관리하고 싶을 때 사용하는 것이 패키지입니다. 파이썬 모듈들을 계층 구조를 사용하며 파이썬 프로그램을 만들면 작업이나 유지 보수를 편리하게 할 수 있고, 모듈의 이름이 중복되더라도 구분할 수 있다는 장점이 있습니다. C++에서 namespace를 사용하는 것과 유사합니다.
① 패키지 만들기 (feat. __init__.py)
패키지를 만드는 방법은 쉽습니다. 여러 모듈들을 적절한 디렉터리에 정리하면 됩니다. 단, 각 폴더에 __init__.py라는 파일이 있어야 합니다. __init__.py의 역할은 파이썬이 해당 디렉터리를 패키지로 인식하게 하는 것입니다. 이로써 흔한 이름을 가지고 있는 폴더들이 실수로 패키지로 인식되지 않습니다. __init__.py는 빈 파일일 수도 있고, 패키지를 위한 초기 코드일 수 있습니다.
② 패키지 사용하기
첫 번째 방법은 import를 통하여 개별적인 모듈을 가져오는 것입니다. 이 때 참조하는 모듈은 전체 디렉터리 경로를 모두 써야 합니다.
import user.math.cal
user.math.cal.plus(3, 5)
두 번째 방법은 from ... import를 통하여 개별적인 모듈을 가져오는 것입니다. 이 방법을 사용하면 첫 번째 방법과는 달리 전체 경로를 적지 않아도 되고 모듈명만 쓰면 됩니다.
from user.math.cal import plus
cal.plus(3, 5)
세 번째 방법은 from ... import를 통하여 모듈의 함수를 가져오는 것입니다.
from user.cal.math import plus
plus(3, 5)
만약 from package import item 과 같은 방식을 사용했을 때, item에는 패키지, 모듈, 모듈 안에 정의된 변수나 함수가 올 수 있습니다. 하지만 import item.subitem.subsubitem 과 같은 방식에서는 모든 item/subitem/subsubitem 에는 패키지나 모듈이 와야 합니다. 이전에 아이템에 정의된 변수나 함수가 올 수는 없습니다.
만약 from package import *를 사용한다면 그 안에 있는 모든 패키지와 모듈들이 자동으로 import 될까요? 만약 이런 방식으로 실행된다면 시간이 오래 걸리고, 원하지 않는 결과를 낳을 수도 있습니다. 이를 해결하기 위해 __init__.py 파일 안에 __all__이라는 리스트를 사용하는 코딩 컨벤션이 있습니다. 이 리스트의 요소들은 from package import *를 사용했을 때 가져와지는 모듈들의 이름으로 인식됩니다.
__all__ 리스트가 다음과 같이 작성되어 있다고 가정해봅시다.
__all__ = ["user", "math", "cal"]
이 뜻은 from package import *를 사용했을 때, user, math, cal 이 3가지 모듈을 가져온다는 것입니다.
__all__이 정의되어 있지 않다면, 명시되어 있는 package만 가져오게 되어서, 그 패키지의 __init__.py를 따라가게 됩니다.
* 물론 추천하는 것은 from package import *를 사용하지 않고 구체적인 모듈명을 사용하는 것입니다.
'데이터 분석 > 기초' 카테고리의 다른 글
[Python] Pandas 라이브러리 기초 1 (0) | 2023.01.24 |
---|---|
[Python] NumPy 라이브러리 기초 2 (0) | 2022.11.24 |
[Python] NumPy 라이브러리 기초 1 (0) | 2022.11.21 |
[Python] 함수(Function)와 메서드(Method)의 차이 (0) | 2022.10.09 |
[Python] 여러 자료형 (0) | 2022.09.29 |