임포트 구조화

Python 패키지 개발하기

James Fulton

Climate informatics researcher

패키지 임포트 없음

import mysklearn
help(mysklearn.preprocessing)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'mysklearn' has no 
  attribute 'preprocessing'

하위 패키지가 있는 패키지의 디렉터리 트리

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python 패키지 개발하기

패키지 임포트 없음

import mysklearn.preprocessing
help(mysklearn.preprocessing)
Help on package mysklearn.preprocessing in 
mysklearn:

NAME
    mysklearn.preprocessing - 표준 전처리 작업을 위한
      서브패키지.

하위 패키지가 있는 패키지의 디렉터리 트리

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python 패키지 개발하기

패키지 임포트 없음

import mysklearn.preprocessing
help(mysklearn.preprocessing.normalize)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 
  'mysklearn.preprocessing' has no attribute
  'normalize'

하위 패키지가 있는 패키지의 디렉터리 트리

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python 패키지 개발하기

패키지 임포트 없음

import mysklearn.preprocessing.normalize
help(mysklearn.preprocessing.normalize)
Help on module mysklearn.preprocessing.normalize
in mysklearn.preprocessing:

NAME
    mysklearn.preprocessing.normalize - 데이터를
      정규화하는 모듈.

하위 패키지가 있는 패키지의 디렉터리 트리

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python 패키지 개발하기

서브패키지를 패키지로 임포트하기

mysklearn/__init__.py

절대 임포트

from mysklearn import preprocessing
  • 가장 많이 사용 - 더 명시적임

상대 임포트

from . import preprocessing
  • 때때로 사용 - 더 짧고 간단할 때가 있음

하위 패키지가 있는 패키지의 디렉터리 트리

mysklearn/
|-- __init__.py        <--
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python 패키지 개발하기

모듈 임포트하기

preprocessingmysklearn에 임포트함

import mysklearn
help(mysklearn.preprocessing)
Help on package mysklearn.preprocessing in 
mysklearn:

NAME
    mysklearn.preprocessing - 표준 전처리 작업을 위한
      서브패키지.

하지만 preprocessingnormalize와 연결되지 않음

import mysklearn
help(mysklearn.preprocessing.normalize)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 
  'mysklearn.preprocessing' has no attribute
  'normalize'
Python 패키지 개발하기

모듈 임포트하기

mysklearn/preprocessing/__init__.py

절대 임포트

from mysklearn.preprocessing import normalize

상대 임포트

from . import normalize

하위 패키지가 있는 패키지의 디렉터리 트리

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python 패키지 개발하기

임포트 재구성

import mysklearn
help(mysklearn.preprocessing.normalize.normalize_data)
Help on function normalize_data in module
mysklearn.preprocessing.normalize:

normalize_data(x)
    데이터 배열을 정규화합니다.
Python 패키지 개발하기

함수를 서브패키지로 임포트

mysklearn/preprocessing/__init__.py

절대 임포트

from mysklearn.preprocessing.normalize import \
    normalize_data

상대 임포트

from .normalize import normalize_data

하위 패키지가 있는 패키지의 디렉터리 트리

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python 패키지 개발하기

함수를 서브패키지로 임포트

import mysklearn
help(mysklearn.preprocessing.normalize_data)
Help on function normalize_data in module
mysklearn_imp.preprocessing.normalize:

normalize_data(x)
    데이터 배열을 정규화합니다.
Python 패키지 개발하기

형제 모듈 간 임포트

normalize.py에서

절대 임포트

from mysklearn.preprocessing.funcs import (
    mymax, mymin
)

상대 임포트

from .funcs import mymax, mymin

하위 패키지가 있는 패키지의 디렉터리 트리

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   |-- funcs.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python 패키지 개발하기

떨어진 모듈 간 임포트

사용자 정의 예외 MyExceptionutils.py에 있습니다.

normalize.py, standardize.py, regression.py에서

절대 임포트

from mysklearn.utils import MyException

상대 임포트

from ..utils import MyException

하위 패키지가 있는 패키지의 디렉터리 트리

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   `-- standardize.py <--
|-- regression
|   |-- __init__.py
|   |-- regression.py  <--
`-- utils.py
Python 패키지 개발하기

상대 임포트 치트시트

  • from . import module
    • 현재 디렉터리에서 module 임포트
  • from .. import module
    • 한 단계 상위 디렉터리에서 module 임포트
  • from .module import function
    • 현재 디렉터리의 모듈에서 function 임포트
  • from ..subpackage.module import function
    • 상위 디렉터리의 서브패키지 내 module에서 function 임포트
Python 패키지 개발하기

Passons à la pratique !

Python 패키지 개발하기

Preparing Video For Download...