组织导入

开发 Python 包

James Fulton

Climate informatics researcher

未导入包情况下

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

包含子包的包目录结构

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
开发 Python 包

未导入包情况下

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

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

包含子包的包目录结构

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
开发 Python 包

未导入包情况下

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'

包含子包的包目录结构

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
开发 Python 包

未导入包情况下

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.

包含子包的包目录结构

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
开发 Python 包

将子包导入包中

mysklearn/__init__.py

绝对导入

from mysklearn import preprocessing
  • 最常用,更明确

相对导入

from . import preprocessing
  • 有时使用,更短且更简单

包含子包的包目录结构

mysklearn/
|-- __init__.py        <--
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
开发 Python 包

导入模块

我们把 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 包

导入模块

mysklearn/preprocessing/__init__.py

绝对导入

from mysklearn.preprocessing import normalize

相对导入

from . import normalize

包含子包的包目录结构

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
开发 Python 包

重构导入

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 包

将函数导入子包

mysklearn/preprocessing/__init__.py

绝对导入

from mysklearn.preprocessing.normalize import \
    normalize_data

相对导入

from .normalize import normalize_data

包含子包的包目录结构

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py    <--
|   |-- normalize.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
开发 Python 包

将函数导入子包

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 包

同级模块间导入

normalize.py

绝对导入

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

相对导入

from .funcs import mymax, mymin

包含子包的包目录结构

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   |-- funcs.py
|   |-- standardize.py
|-- regression
|   |-- __init__.py
|   |-- regression.py
|-- utils.py
开发 Python 包

跨层级模块间导入

自定义异常 MyExceptionutils.py

normalize.pystandardize.pyregression.py

绝对导入

from mysklearn.utils import MyException

相对导入

from ..utils import MyException

包含子包的包目录结构

mysklearn/
|-- __init__.py
|-- preprocessing
|   |-- __init__.py
|   |-- normalize.py   <--
|   `-- standardize.py <--
|-- regression
|   |-- __init__.py
|   |-- regression.py  <--
`-- utils.py
开发 Python 包

相对导入速查表

  • from . import module
    • 从当前目录导入 module
  • from .. import module
    • 从上一级目录导入 module
  • from .module import function
    • 从当前目录下的模块导入 function
  • from ..subpackage.module import function
    • 从上一级目录的子包中、其模块导入 function
开发 Python 包

Passons à la pratique !

开发 Python 包

Preparing Video For Download...