Python Package, Module and Import

Table of Contents

1. Python Package Module and Import

1.1. package and module

~/download/test_pkg@sunway-t14> tree .
.
├── __init__.py
├── main.py
├── module1
│   ├── foo.py
│   ├── bar.py
│   ├── __init__.py
├── module2.py

在上面的例子中:

  • test_pkg 是一个 package
  • module1 是一个 module, 对应 module1 这个目录
  • module1.foo 是一个 module, 对应 module1/foo.py
  • module2 是一个 module, 对应 module2.py
  • module1.foo.foo 和 module2.foo 是两个 module 中定义的函数, 它们不是 module

1.2. import

1.2.1. import 两种写法:

  1. import <module>
  2. from <module> import <module|symbol>

import 和 from 后必须跟 module, 所以:

  • import module2.foo 会失败, 因为 module2.foo 不是 module
  • from module2 import foo 可以成功

1.2.2. as

import 会绑定名称以便使用, 例如:

import module1.foo 之后可以用 module1.foo 引用 module1.foo 这个 module, 通过 as, 可以绑定到一个自定义的名字:

  • import module1.foo as foo1
  • from module1 import foo as foo1

不过有一个问题: as 绑定的名字无法做为 module 的别名…. 例如 import module1 as m1; import m1.foo 会失败, 提示 m1 不是一个 module name

1.2.3. from

相对于普通的 import <module>, from <module> import xxx 更灵活一些:

  1. 它可以 import 除 module 外的其它符号, 比如 class, function, variable 等
  2. 它可以支持 relative import

1.2.4. relative import

在同一个 pacakge 下的不同的 module 引用其它 module, 有两种方法:

  1. absolution import

    module1.foo 引用 module1.bar: import module1.bar module1.foo 引用 module2: import module2

    直接用 import bar 会失败, 必须是完整的名称

  2. relative import

    module1.foo 引用其它 module:

    from . import bar from .. import module2 from .bar import *

    通过 relative import, 一个 submodule 可以容易的复制到其它 package 中, 或者做为整体更改它在 package 中的层次

Author: [email protected]
Date: 2021-01-08 Fri 00:00
Last updated: 2022-01-24 Mon 19:34

知识共享许可协议