การจัดโครงสร้าง imports

การพัฒนา Python Packages

James Fulton

Climate informatics researcher

ไม่มีการ import แพ็กเกจ

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

โครงสร้างไดเรกทอรีของแพ็กเกจที่มี subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
การพัฒนา Python Packages

ไม่มีการ import แพ็กเกจ

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

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

โครงสร้างไดเรกทอรีของแพ็กเกจที่มี subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
การพัฒนา Python Packages

ไม่มีการ import แพ็กเกจ

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'

โครงสร้างไดเรกทอรีของแพ็กเกจที่มี subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
การพัฒนา Python Packages

ไม่มีการ import แพ็กเกจ

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.

โครงสร้างไดเรกทอรีของแพ็กเกจที่มี subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
การพัฒนา Python Packages

การ import subpackages เข้าสู่แพ็กเกจ

mysklearn/__init__.py

Absolute import

from mysklearn import preprocessing
  • ใช้บ่อยที่สุด — ระบุที่มาชัดเจน

Relative import

from . import preprocessing
  • ใช้บางครั้ง — สั้นกว่าและเข้าใจง่ายกว่าในบางกรณี

โครงสร้างไดเรกทอรีของแพ็กเกจที่มี subpackages

mysklearn/
|-- __init__.py        <--
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
การพัฒนา Python Packages

การ import โมดูล

เรา import preprocessing เข้าสู่ mysklearn แล้ว

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

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

แต่ preprocessing ยังไม่เชื่อมต่อกับ 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 Packages

การ import โมดูล

mysklearn/preprocessing/__init__.py

Absolute import

from mysklearn.preprocessing import normalize

Relative import

from . import normalize

โครงสร้างไดเรกทอรีของแพ็กเกจที่มี subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
การพัฒนา Python Packages

การปรับโครงสร้าง 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.
การพัฒนา Python Packages

การ import ฟังก์ชันเข้าสู่ subpackage

mysklearn/preprocessing/__init__.py

Absolute import

from mysklearn.preprocessing.normalize import \
    normalize_data

Relative import

from .normalize import normalize_data

โครงสร้างไดเรกทอรีของแพ็กเกจที่มี subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
การพัฒนา Python Packages

การ import ฟังก์ชันเข้าสู่ 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.
การพัฒนา Python Packages

การ import ระหว่างโมดูลที่อยู่ในระดับเดียวกัน

ใน normalize.py

Absolute import

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

Relative import

from .funcs import mymax, mymin

โครงสร้างไดเรกทอรีของแพ็กเกจที่มี subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   |-- funcs.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
การพัฒนา Python Packages

การ import ระหว่างโมดูลที่ห่างกัน

exception แบบกำหนดเอง MyException อยู่ใน utils.py

ใน normalize.py, standardize.py และ regression.py

Absolute import

from mysklearn.utils import MyException

Relative import

from ..utils import MyException

โครงสร้างไดเรกทอรีของแพ็กเกจที่มี subpackages

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   `-- standardize.py <--
|-- regression
|   |-- __init__.py
|   |-- regression.py  <--
`-- utils.py
การพัฒนา Python Packages

สรุป relative import

  • from . import module
    • Import module จากไดเรกทอรีปัจจุบัน
  • from .. import module
    • Import module จากไดเรกทอรีระดับบน
  • from .module import function
    • Import function จากโมดูลในไดเรกทอรีปัจจุบัน
  • from ..subpackage.module import function
    • Import function จากโมดูลใน subpackage ที่อยู่ระดับบนหนึ่งชั้น
การพัฒนา Python Packages

มาฝึกกันเถอะ!

การพัฒนา Python Packages

Preparing Video For Download...