Estruturando imports

Desenvolvendo pacotes Python

James Fulton

Climate informatics researcher

Sem imports no pacote

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

Árvore de diretórios do pacote com subpacotes

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Desenvolvendo pacotes Python

Sem imports no pacote

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

NAME
    mysklearn.preprocessing - Um subpacote 
      para operações padrão de pré-processamento.

Árvore de diretórios do pacote com subpacotes

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Desenvolvendo pacotes Python

Sem imports no pacote

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'

Árvore de diretórios do pacote com subpacotes

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Desenvolvendo pacotes Python

Sem imports no pacote

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

NAME
    mysklearn.preprocessing.normalize - Um módulo
      para normalizar dados.

Árvore de diretórios do pacote com subpacotes

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Desenvolvendo pacotes Python

Importando subpacotes no pacote

mysklearn/__init__.py

Import absoluto

from mysklearn import preprocessing
  • Usado com mais frequência — mais explícito

Import relativo

from . import preprocessing
  • Usado às vezes — mais curto e, às vezes, mais simples

Árvore de diretórios do pacote com subpacotes

mysklearn/
|-- __init__.py        <--
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Desenvolvendo pacotes Python

Importando módulos

Importamos preprocessing em mysklearn

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

NAME
    mysklearn.preprocessing - Um subpacote 
      para operações padrão de pré-processamento.

Mas preprocessing não aponta para 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'
Desenvolvendo pacotes Python

Importando módulos

mysklearn/preprocessing/__init__.py

Import absoluto

from mysklearn.preprocessing import normalize

Import relativo

from . import normalize

Árvore de diretórios do pacote com subpacotes

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Desenvolvendo pacotes Python

Reestruturando imports

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.
Desenvolvendo pacotes Python

Importar função no subpacote

mysklearn/preprocessing/__init__.py

Import absoluto

from mysklearn.preprocessing.normalize import \
    normalize_data

Import relativo

from .normalize import normalize_data

Árvore de diretórios do pacote com subpacotes

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Desenvolvendo pacotes Python

Importar função no subpacote

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.
Desenvolvendo pacotes Python

Imports entre módulos irmãos

Em normalize.py

Import absoluto

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

Import relativo

from .funcs import mymax, mymin

Árvore de diretórios do pacote com subpacotes

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   |-- funcs.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Desenvolvendo pacotes Python

Imports entre módulos distantes

Uma exceção personalizada MyException está em utils.py

Em normalize.py, standardize.py e regression.py

Import absoluto

from mysklearn.utils import MyException

Import relativo

from ..utils import MyException

Árvore de diretórios do pacote com subpacotes

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   `-- standardize.py <--
|-- regression
|   |-- __init__.py
|   |-- regression.py  <--
`-- utils.py
Desenvolvendo pacotes Python

Guia rápido de import relativo

  • from . import module
    • Do diretório atual, importe module
  • from .. import module
    • Um nível acima, importe module
  • from .module import function
    • Do módulo no diretório atual, importe function
  • from ..subpackage.module import function
    • Do subpacote um nível acima, no module desse subpacote, importe function
Desenvolvendo pacotes Python

Vamos praticar!

Desenvolvendo pacotes Python

Preparing Video For Download...