Strukturyzacja importów

Tworzenie pakietów w Pythonie

James Fulton

Climate informatics researcher

Bez importów pakietów

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

Drzewo katalogów pakietu z podpakietami

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Tworzenie pakietów w Pythonie

Bez importów pakietów

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

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

Drzewo katalogów pakietu z podpakietami

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Tworzenie pakietów w Pythonie

Bez importów pakietów

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'

Drzewo katalogów pakietu z podpakietami

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Tworzenie pakietów w Pythonie

Bez importów pakietów

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.

Drzewo katalogów pakietu z podpakietami

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Tworzenie pakietów w Pythonie

Importowanie podpakietów do pakietów

mysklearn/__init__.py

Import bezwzględny

from mysklearn import preprocessing
  • Używany najczęściej – bardziej jednoznaczny

Import względny

from . import preprocessing
  • Używany niekiedy – krótszy i prostszy

Drzewo katalogów pakietu z podpakietami

mysklearn/
|-- __init__.py        <--
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Tworzenie pakietów w Pythonie

Importowanie modułów

Zaimportowaliśmy preprocessing do mysklearn

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

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

Ale preprocessing nie ma powiązania z 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'
Tworzenie pakietów w Pythonie

Importowanie modułów

mysklearn/preprocessing/__init__.py

Import bezwzględny

from mysklearn.preprocessing import normalize

Import względny

from . import normalize

Drzewo katalogów pakietu z podpakietami

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Tworzenie pakietów w Pythonie

Restrukturyzacja importów

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.
Tworzenie pakietów w Pythonie

Import funkcji do podpakietu

mysklearn/preprocessing/__init__.py

Import bezwzględny

from mysklearn.preprocessing.normalize import \
    normalize_data

Import względny

from .normalize import normalize_data

Drzewo katalogów pakietu z podpakietami

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Tworzenie pakietów w Pythonie

Import funkcji do podpakietu

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.
Tworzenie pakietów w Pythonie

Importowanie między modułami siostrzanymi

W normalize.py

Import bezwzględny

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

Import względny

from .funcs import mymax, mymin

Drzewo katalogów pakietu z podpakietami

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   |-- funcs.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Tworzenie pakietów w Pythonie

Importowanie między odległymi modułami

Własny wyjątek MyException znajduje się w utils.py

W normalize.py, standardize.py i regression.py

Import bezwzględny

from mysklearn.utils import MyException

Import względny

from ..utils import MyException

Drzewo katalogów pakietu z podpakietami

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   `-- standardize.py <--
|-- regression
|   |-- __init__.py
|   |-- regression.py  <--
`-- utils.py
Tworzenie pakietów w Pythonie

Ściągawka: importy względne

  • from . import module
    • Z bieżącego katalogu importuje module
  • from .. import module
    • Z katalogu nadrzędnego importuje module
  • from .module import function
    • Z modułu w bieżącym katalogu importuje function
  • from ..subpackage.module import function
    • Z podpakietu w katalogu nadrzędnym, z module w tym podpakiecie, importuje function
Tworzenie pakietów w Pythonie

Czas na ćwiczenia!

Tworzenie pakietów w Pythonie

Preparing Video For Download...