[Python] 패키지(Package)
1. 패키지란 무엇인가?
패키지는 여러 모듈을 계층적인 파일 구조로 구성한 것입니다. 패키지를 사용하면 대규모 프로젝트에서 코드를 더 효율적으로 구조화하고 관리할 수 있습니다. 패키지는 관련된 모듈들을 그룹화하여 이름 충돌을 방지하고 코드의 구조를 더 명확하게 만듭니다.
2. 파이썬 패키지의 구조
파이썬 패키지의 기본 구조는 다음과 같습니다:
my_package/
__init__.py
module1.py
module2.py
subpackage/
__init__.py
module3.py
module4.py
my_package
는 최상위 패키지 디렉토리입니다.__init__.py
파일은 해당 디렉토리가 패키지임을 나타냅니다.module1.py
,module2.py
등은 패키지 내의 모듈들입니다.subpackage
는 하위 패키지입니다.
3. 패키지 만들기
- 패키지로 사용할 디렉토리를 생성합니다.
- 패키지 디렉토리 안에
__init__.py
파일을 생성합니다. (Python 3.3+ 버전에서는 선택사항이지만, 하위 호환성을 위해 생성하는 것이 좋습니다) - 필요한 모듈 파일들을 생성합니다.
예를 들어, 다음과 같은 구조의 math_operations
패키지를 만들어 봅시다:
math_operations/
__init__.py
basic_ops.py
advanced_ops.py
basic_ops.py
:
def add(a, b):
return a + b
def subtract(a, b):
return a - b
advanced_ops.py
:
import math
def square_root(x):
return math.sqrt(x)
def power(base, exponent):
return base ** exponent
__init__.py
:
from .basic_ops import add, subtract
from .advanced_ops import square_root, power
4. 패키지 안의 함수 사용하기
패키지 안의 함수를 사용하는 방법은 여러 가지가 있습니다:
- 전체 패키지 임포트:
import math_operations result = math_operations.basic_ops.add(5, 3) print(result) # 출력: 8
- 특정 모듈 임포트:
from math_operations import basic_ops result = basic_ops.subtract(10, 7) print(result) # 출력: 3
- 특정 함수 임포트:
from math_operations.advanced_ops import square_root result = square_root(16) print(result) # 출력: 4.0
__init__.py
에 정의된 함수 직접 임포트:from math_operations import add, power print(add(2, 3)) # 출력: 5 print(power(2, 3)) # 출력: 8
5. __init__.py
__init__.py
파일은 패키지를 초기화하는 역할을 합니다. 이 파일이 없으면 해당 디렉토리는 패키지로 인식되지 않습니다. __init__.py
파일은 패키지 내의 모듈을 불러오거나 초기화 코드를 작성하는 데 사용됩니다.
# math_operations/__init__.py
from .basic_ops import add, subtract
from .advanced_ops import square_root, power
print("math_operations 패키지가 초기화되었습니다.")
__init__.py
파일이 실행될 때, 패키지의 초기화 코드가 실행됩니다.
6. __all__
__all__
리스트는 from package import *
구문을 사용할 때 어떤 모듈이나 이름을 가져올지 명시적으로 정의합니다. __init__.py
파일에 정의하여 사용합니다.
# __init__.py
__all__ = ['basic_ops', 'advanced_ops']
from . import basic_ops
from . import advanced_ops
이렇게 하면 from math_operations import *
를 사용할 때 basic_ops
와 advanced_ops
모듈만 임포트됩니다.
__all__
을 사용하면 패키지에서 공개하고자 하는 모듈이나 이름을 명확히 제어할 수 있으며, 의도치 않은 이름 공개를 방지할 수 있습니다.
Leave a comment