Imports strukturieren

Python-Pakete entwickeln

James Fulton

Climate informatics researcher

Ohne Paket-Imports

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

Verzeichnisbaum für Paket mit Unterpaketen

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-Pakete entwickeln

Ohne Paket-Imports

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

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

Verzeichnisbaum für Paket mit Unterpaketen

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-Pakete entwickeln

Ohne Paket-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'

Verzeichnisbaum für Paket mit Unterpaketen

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-Pakete entwickeln

Ohne Paket-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.

Verzeichnisbaum für Paket mit Unterpaketen

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-Pakete entwickeln

Unterpakete in Pakete importieren

mysklearn/__init__.py

Absoluter Import

from mysklearn import preprocessing
  • Am häufigsten genutzt – eindeutiger

Relativer Import

from . import preprocessing
  • Manchmal genutzt – kürzer und teils einfacher

Verzeichnisbaum für Paket mit Unterpaketen

mysklearn/
|-- __init__.py        <--
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-Pakete entwickeln

Module importieren

Wir haben preprocessing in mysklearn importiert

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

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

Aber preprocessing verweist nicht auf 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-Pakete entwickeln

Module importieren

mysklearn/preprocessing/__init__.py

Absoluter Import

from mysklearn.preprocessing import normalize

Relativer Import

from . import normalize

Verzeichnisbaum für Paket mit Unterpaketen

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-Pakete entwickeln

Imports umstrukturieren

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-Pakete entwickeln

Funktion ins Unterpaket importieren

mysklearn/preprocessing/__init__.py

Absoluter Import

from mysklearn.preprocessing.normalize import \
    normalize_data

Relativer Import

from .normalize import normalize_data

Verzeichnisbaum für Paket mit Unterpaketen

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-Pakete entwickeln

Funktion ins Unterpaket importieren

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-Pakete entwickeln

Zwischen Geschwister-Modulen importieren

In normalize.py

Absoluter Import

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

Relativer Import

from .funcs import mymax, mymin

Verzeichnisbaum für Paket mit Unterpaketen

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   |-- funcs.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Python-Pakete entwickeln

Zwischen weiter entfernten Modulen importieren

Eine eigene Exception MyException steht in utils.py

In normalize.py, standardize.py und regression.py

Absoluter Import

from mysklearn.utils import MyException

Relativer Import

from ..utils import MyException

Verzeichnisbaum für Paket mit Unterpaketen

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   `-- standardize.py <--
|-- regression
|   |-- __init__.py
|   |-- regression.py  <--
`-- utils.py
Python-Pakete entwickeln

Spickzettel für relative Imports

  • from . import module
    • Aus dem aktuellen Verzeichnis module importieren
  • from .. import module
    • Aus dem übergeordneten Verzeichnis module importieren
  • from .module import function
    • Aus Modul im aktuellen Verzeichnis function importieren
  • from ..subpackage.module import function
    • Aus Unterpaket eine Ebene höher, aus module darin, function importieren
Python-Pakete entwickeln

Lass uns üben!

Python-Pakete entwickeln

Preparing Video For Download...