Cấu trúc import

Phát triển gói Python

James Fulton

Climate informatics researcher

Không import package

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

Cây thư mục cho package có subpackage

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Phát triển gói Python

Không import package

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

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

Cây thư mục cho package có subpackage

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Phát triển gói Python

Không import package

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'

Cây thư mục cho package có subpackage

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Phát triển gói Python

Không import package

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.

Cây thư mục cho package có subpackage

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Phát triển gói Python

Import subpackage vào package

mysklearn/__init__.py

Import tuyệt đối

from mysklearn import preprocessing
  • Dùng nhiều nhất - rõ ràng hơn

Import tương đối

from . import preprocessing
  • Đôi khi dùng - ngắn và đôi lúc đơn giản hơn

Cây thư mục cho package có subpackage

mysklearn/
|-- __init__.py        <--
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Phát triển gói Python

Import module

Ta đã import preprocessing vào mysklearn

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

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

Nhưng preprocessing chưa liên kết với 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'
Phát triển gói Python

Import module

mysklearn/preprocessing/__init__.py

Import tuyệt đối

from mysklearn.preprocessing import normalize

Import tương đối

from . import normalize

Cây thư mục cho package có subpackage

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Phát triển gói Python

Tái cấu trúc import

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.
Phát triển gói Python

Import hàm vào subpackage

mysklearn/preprocessing/__init__.py

Import tuyệt đối

from mysklearn.preprocessing.normalize import \
    normalize_data

Import tương đối

from .normalize import normalize_data

Cây thư mục cho package có subpackage

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Phát triển gói Python

Import hàm vào subpackage

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.
Phát triển gói Python

Import giữa các module cùng cấp

Trong normalize.py

Import tuyệt đối

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

Import tương đối

from .funcs import mymax, mymin

Cây thư mục cho package có subpackage

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   |-- funcs.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
Phát triển gói Python

Import giữa các module cách xa nhau

Một exception tùy chỉnh MyException nằm trong utils.py

Trong normalize.py, standardize.pyregression.py

Import tuyệt đối

from mysklearn.utils import MyException

Import tương đối

from ..utils import MyException

Cây thư mục cho package có subpackage

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   `-- standardize.py <--
|-- regression
|   |-- __init__.py
|   |-- regression.py  <--
`-- utils.py
Phát triển gói Python

Ghi nhớ nhanh import tương đối

  • from . import module
    • Từ thư mục hiện tại, import module
  • from .. import module
    • Lùi lên một thư mục, import module
  • from .module import function
    • Từ module trong thư mục hiện tại, import function
  • from ..subpackage.module import function
    • Từ subpackage ở một thư mục phía trên, trong module của subpackage đó, import function
Phát triển gói Python

Ayo berlatih!

Phát triển gói Python

Preparing Video For Download...