Python Package
- 모듈과 패키지란?
실제 개발 할 때는 다수의 파이썬 파일을 유기적으로 연결하고 남이 만든 코드도 적극 활용한다. 어떤 파이썬 파일에서 import키워드를 통해 외부 파이썬 파일의 함수, 변수, 클래스를 가져다 쓸 수 있다. 외부 코드는 기능별로 파일에 저장하는데 규모가 작으면 하나의 파일에, 규모가 크면 여러 파일에 구현 후 하나의 폴더에 담을 수도 있다. 이때 각각의 .py 파일을 모듈(Module)이라 하고 여러 모듈을 묶은 폴더를 패키지(package)라 한다. 파이썬의 오픈 소스들은 패키지 단위로 설치가 되기에 패키지라는 용어를 자주 쓴다.
- 모듈 만들기
모듈은 단순 파이썬 파일이다. 특정 파이썬 파일에 함수와 변수를 만들고 이를 다른 파일에 가져다 쓸 수 있다.
# list_ops.py
def add(foo, bar):
out = []
for f, b in zip(foo, bar):
out.append(f + b)
return out
def subtract(foo, bar):
out = []
for f, b in zip(foo, bar):
out.append(f - b)
return out
def multiply(foo, bar):
out = []
for f, b in zip(foo, bar):
out.append(f * b)
return out
def divide(foo, bar):
out = []
for f, b in zip(foo, bar):
out.append(f / b)
return out
x = [51, 23]
y = [34, 67]
if __name__ == '__main__':
z = add(x, y)
리스트 원소에 대한 사칙연산 함수 외에 x, y, z라는 변수를 만들었다.
- 모듈 사용하기
list_ops.py를 가져다 만든 함수와 변수를 사용해보자. import를 활용해 외부 모듈을 가져오는 방법은 다양하다.
출력 :
[1, 2, 3, 4, 5] + [24, 52, 15, 24] = [25, 54, 18, 28]
[51, 23] * [34, 67] = [1734, 1541]
1. 모듈 이름 그대로 가져오기
외부 모듈에서 어떤 객체를 가져올 때 모듈명.객체명으로 가져오면 된다. 함수가 정상 작동하는 것을 확인 할 수 있다. 마지막 줄을 보면 import한 모듈에서 변수 또한 가져올 수 있다. 당연해보이지만 C언어나 다른 언어를 생각해보면 그렇지 않다.
list_ops.py에 실행 가능한 코드를 넣되 외부에서 import할 때 실행되지 않게 하고 싶다면 __name__변수를 써야한다. z라는 변수가 if__name__=='__main__':조건문 아래 있기 때문에 외부에서 import 할 때는 선언되지 않는다.
import list_ops
foo = [1, 2, 3, 4, 5]
bar = [24, 52, 15, 24]
goo = list_ops.add(foo, bar)
print(f"{foo} + {bar} = {goo}")
goo = list_ops.multiply(list_ops.x, list_ops.y)
print(f"{list_ops.x} * {list_ops.y} = {goo}")
2. 모듈 이름을 바꿔서 가져오기
모듈의 기능을 이해하기 쉽게 몇 단어를 이어 길게 짓는 것이 보통이다. 게다가 패키지에서 복잡한 폴더 구조 아래 있는 모듈을 가져올 때 import 문은 더욱 길어진다. 이때 모듈의 객체를 불러올 때마다 긴 모듈 이름을 쓰는 것은 번거로우므로 별명을 지을 수 있다. import A as B 와 같이 A 모듈을 B라는 별칭으로 사용 할 수 있는 것이다.
import list_ops as lo
foo = [1, 2, 3, 4, 5]
bar = [24, 52, 15, 24]
goo = lo.subtract(bar, foo)
print(f"{bar} - {foo} = {goo}")
goo = lo.divide(bar, foo)
print(f"{bar} / {foo} = {goo}")
출력 :
[24, 52, 15, 24] - [1, 2, 3, 4, 5] = [23, 50, 12, 20]
[24, 52, 15, 24] / [1, 2, 3, 4, 5] = [24.0, 26.0, 5.0, 6.0]
3. 모듈에서 지정한 객체만 가져오기
외부 모듈명을 쓰지 않고 바로 함수나 변수를 사용하고 싶을 때는 from module import object를 쓰면 된다. from을 써서 가져온 객체는 모듈명 생략이 가능하다.
from list_ops import add, subtract, x
foo = [1, 2, 3, 4, 5]
bar = [24, 52, 15, 24]
goo = add(foo, bar)
print(f"{foo} + {bar} = {goo}")
goo = subtract(bar, foo)
print(f"{bar} - {foo} = {goo}")
print(f"x= {spam}")
출력 :
[1, 2, 3, 4, 5] + [24, 52, 15, 24] = [25, 54, 18, 28]
[24, 52, 15, 24] - [1, 2, 3, 4, 5] = [23, 50, 12, 20]
x = [51, 23]
- 패키지 만들기
패키지는 여러 모듈이 폴더 단위로 모인 것으로 폴더 안에 폴더를 넣어 계층적으로 만들 수도 있다. 이제 package란 폴더를 만들어 안에 위에서 만든 list_ops.py를 옮기고 dict_ops.py도 만들어 넣겠다.
# dict_ops.py
def add(foo, bar):
out = {}
for key in foo.keys():
if key in bar:
out[key] = foo[key] + bar[key]
return out
def subtract(foo, bar):
out = {}
for key in foo.keys():
if key in bar:
out[key] = foo[key] - bar[key]
return out
def multiply(foo, bar):
out = {}
for key in foo.keys():
if key in bar:
out[key] = foo[key] * bar[key]
return out
def divide(foo, bar):
out = {}
for key in foo.keys():
if key in bar:
out[key] = foo[key] / bar[key]
return out
이제 이 패키지를 불러오는 예제를 해보겠다. 키와 몸무게를 입력하여 BMI를 계산하는 코드다. 각각 별칭으로 불러오겠다.
import package.list_ops as lo
import package.dict_ops as do
weights = [55, 90, 55, 78]
heights = [1.63, 1.78, 1.59, 1.83]
heights_sq = lo.multiply(heights, heights)
bmi = lo.divide(weights, heights_sq)
print("BMI:", bmi)
names_weight = ["A", "B", "C", "D"]
names_height = ["B", "C", "D", "E"]
weights = dict(zip(names_weight , weights))
heights = dict(zip(names_height , heights))
print("dict weights:", weights)
print("dict heights:", heights)
heights_sq = do.multiply(heights, heights)
bmi = do.divide(weights, heights_sq)
print("BMI:", bmi)
출력 :
dict weights: {'A': 55, 'B': 90, 'C': 55, 'D': 78}
dict heights: {'B': 1.63, 'C': 1.78, 'D': 1.59, 'E': 1.83}
BMI: {'B': 33.87406375851557, 'C': 17.35891932836763, 'D': 30.853209920493647}
dict_ops는 입력 인자 foo, bar에 공통적으로 있는 key에 대해서만 연산을 수행한다.
'학부 생활 + 랩실 > Python' 카테고리의 다른 글
| 파이썬(9) - 유틸리티 (0) | 2026.04.05 |
|---|---|
| 파이썬(8) - 클래스 (0) | 2026.04.04 |
| 파이썬(6) - 함수 (0) | 2026.04.04 |
| 파이썬(5) - 제어문 (0) | 2026.04.03 |
| 파이썬(4) - 컨테이너(2) 딕셔너리, 튜플 (0) | 2026.04.03 |