Структурування імпортів

Розроблення пакетів 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 - A subpackage 
      for standard preprocessing operations.

Дерево тек для пакета з підпакетами

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 - A module
      for normalizing data.

Дерево тек для пакета з підпакетами

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

Імпорт модулів

Ми імпортували preprocessing у mysklearn

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

NAME
    mysklearn.preprocessing - A subpackage 
      for standard preprocessing operations.

Але preprocessing не має посилання на normalize

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)
    Normalize the data array.
Розроблення пакетів 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)
    Normalize the data array.
Розроблення пакетів 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

Імпорт між віддаленими модулями

Користувацький виняток MyException у utils.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

Давайте потренуємось!

Розроблення пакетів Python

Preparing Video For Download...