模块-导入
模块定制可被导入的变量
定义 __all__
# b.py
__all__ = ["foo"]
foo = 1
bar = 2
from a.b import *
print(foo) # 1
print(bar) # NameError: name 'bar' is not defined
导入指令
import sys [as `other-name`] # 导入标准库模块 sys [并重命名为`other-name`]
import http.server # 从标准库 http 包中导入模块 server
from sys import path # 从标准库 sys 中导入 path 变量/函数
from http.server import HTTPServer # 从标准库 http 包内的 server 模块导入 HTTPServer 类/方法/对象/符号
from . import foo # 从当前模块同级包导入 foo 模块
from .foo import bar # 从当前模块同级包内的 foo 模块导入 bar 符号
from ..foo import bar # 从当前模块上级包内的 foo 模块导入 bar 符号
相对导入没有 import .xxx 的写法
相对导入往上查找一级,多添加一个
.
约束一:__main__
不允许使用相对导入
# main.py
from . import foo # ImportError: attempted relative import with no known parent package
约束二:模块相对导入不能超过顶层包
.
├── main.py
├── package1
│ ├── __init__.py
│ ├── moduleA.py
└── package2
└── moduleB.py
# moduleA.py
a = 1
# moduleB.py
from ..package1.moduleA import a
# main.py
import package2.moduleB
执行 python main.py
,会报错
ImportError: attempted relative import beyond top-level package
这是因为 moduleB
的顶包为 package2
,但是现在想越过 package2
访问 package1.moduleA
,超过了 package1
,所以报错了