Tennis Package 만들기

파이썬 패키지는 파이썬 모듈들의 집합체라 할수 있다. 여기서 모듈은 하나의 파이썬 파일이다. 우리는 앞서 개발한 테니스 프로젝트를 패키지화 시키고자 한다.

init.py 역할

파이썬에서 특정 디렉토리를 import 할때 가장 먼저 실행되는 파일이다. 여기서 패키지 내부에 있는 모듈을 뭉쳐주는 역할을 한다.

디렉터리

아래는 tennis 패키지의 폴더 구조이다.

tennis/
├─ data
│   └─ court_reference.png
│   └─ drawed_court.png
├─ __init__.py
├─ detectors.py
├─ geomath.py
├─ reference.py
├─ dataclasses.py
├─ trakcer.py
...

모듈 생성

몇 가지 모듈의 구조를 만들어보자

# tennis/traker.py
__all__ = ['TennisBallTracking', 'Trace' ]

from . import dataclasses
class TennisBallTracking:
    ...

class Trace:
    ...

# tennis/detector.py
__all__ = ['TennisCourtDetection', 'detect' ]
import cv2 as cv
import numpy as np

from . import tracker
from . import reference
from . import dataclasses
class TennisCourtDetection:
    tracking = tracker.TennisBallTracking()
    ...

def detect(a, b):
    pass

위 파이썬 파일처럼 __all__ 함수에 외부에서 사용할 수 있는 클래스나 함수를 등록해두면 된다. 모듈에서 다른 모듈을 호출할때는 from . import dataclasses 와 같은 형식으로 작성하면 좋다.

init.py 작성

모듈을 위와 같이 작성하였다면 __init__.py 는 아래와 같은 형식으로 작성한다.

# tennis/__init__.py
from .detectors import *
from .tracker import *
from .dataclasses import *

__all__ = (
    detectors.__all__ +
    tracker.__all__ +
    dataclasses.__all__
)

import

이제 tennis 패키지 외부에서 호출하여 사용해보자

# main.py

import tennis
def main():
    tracking = tennis.TennisBallTracking()
    detect = tennis.TennisCourtDetection()
    trace = tennis.Trace()

    ...