Imports structureren

Python-pakketten ontwikkelen

James Fulton

Climate informatics researcher

Zonder package-imports

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

Mapstructuur voor package met subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-pakketten ontwikkelen

Zonder package-imports

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

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

Mapstructuur voor package met subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-pakketten ontwikkelen

Zonder package-imports

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'

Mapstructuur voor package met subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-pakketten ontwikkelen

Zonder package-imports

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.

Mapstructuur voor package met subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-pakketten ontwikkelen

Subpackages in packages importeren

mysklearn/__init__.py

Absolute import

from mysklearn import preprocessing
  • Meest gebruikt – explicieter

Relatieve import

from . import preprocessing
  • Soms gebruikt – korter en soms eenvoudiger

Mapstructuur voor package met subpackages

mysklearn/
|-- __init__.py        <--
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-pakketten ontwikkelen

Modules importeren

We importeerden preprocessing in mysklearn

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

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

Maar preprocessing verwijst niet naar 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-pakketten ontwikkelen

Modules importeren

mysklearn/preprocessing/__init__.py

Absolute import

from mysklearn.preprocessing import normalize

Relatieve import

from . import normalize

Mapstructuur voor package met subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-pakketten ontwikkelen

Imports herstructureren

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-pakketten ontwikkelen

Functie in subpackage importeren

mysklearn/preprocessing/__init__.py

Absolute import

from mysklearn.preprocessing.normalize import \
    normalize_data

Relatieve import

from .normalize import normalize_data

Mapstructuur voor package met subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-pakketten ontwikkelen

Functie in subpackage importeren

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-pakketten ontwikkelen

Importeren tussen sibling-modules

In normalize.py

Absolute import

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

Relatieve import

from .funcs import mymax, mymin

Mapstructuur voor package met subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   |-- funcs.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-pakketten ontwikkelen

Importeren tussen verder gelegen modules

Een eigen exceptie MyException staat in utils.py

In normalize.py, standardize.py en regression.py

Absolute import

from mysklearn.utils import MyException

Relatieve import

from ..utils import MyException

Mapstructuur voor package met subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   `-- standardize.py <--
|-- regression
|   |-- __init__.py
|   |-- regression.py  <--
`-- utils.py
Python-pakketten ontwikkelen

Spiekbriefje relatieve imports

  • from . import module
    • Importeer module uit de huidige map
  • from .. import module
    • Importeer module uit één map hoger
  • from .module import function
    • Importeer function uit module in huidige map
  • from ..subpackage.module import function
    • Importeer function uit module in subpackage één map hoger
Python-pakketten ontwikkelen

Laten we oefenen!

Python-pakketten ontwikkelen

Preparing Video For Download...