Import
下面是包的结构
package
├── __init__.py
├── subpackage1
│ ├── __init__.py
│ ├── moduleX.py
│ └── moduleY.py
├── subpackage2
│ ├── __init__.py
│ └── moduleZ.py
└── moduleA.py
我们现在在moduleX.py中。
有绝对路径引入和相对路径引入两种方法。相对路径对于绝对路径来说优势为: 当调整模块和包的时候如果是绝对路径那么需要一个个挨着改。绝对路径对于相对路径来说优势为:相对路径取决于当前的包,所以在哪里执行就会有不一样的难以预料的后果(from . import module error: main is not a package。相对引用的' . '符号对应的就是__name__的值。如果在main函数中执行这个' . '就是__main__而不是上级包名。此时用from baoming import module就能解决)。 下面来导入一些包:[A]表示绝对路径 | [B]表示相对路径。
导入同一个子包下的 moduleY
[A] from package.subpackage1 import moduleY
[B] from . import moduleY
导入同一个子包下的 moduleY.py中的spam函数
[A] from package.subpackage1.moduleY import spam
[B] from .moduleY import spam
从兄弟子包下的moduleZ中导入func函数
[A] from package.subpackage2.moduleZ import func
[B] from ..moduleZ import func
导入父包下的moduleA
[A] from package import moduleA
[B] from .. import moduleA 或from ...package import moduleA
引用中有一个最常见的错误就是:循环引用
A.py
from .B import B_greet_back
def A_say_hello():
print('A says hello!')
B_greet_back()
def A_greet_back():
print('A says hello back!')
if __name__ == '__main__':
A_say_hello()
B.py
from .A import A_greet_back
def B_say_hello():
print('B says hello!')
A_greet_back()
def B_greet_back():
print('B says hello back!')
if __name__ == '__main__':
B_say_hello()
此时会有引用错误:ImportError: cannot import name 'A_greet_back'
[解决办法]
1.可以引用整个包而不是指定引用包里的函数
更改 b.py from .A import A_greet_back 为 from . import A
2.延迟引用
B.py
def B_say_hello():
from .A import A_greet_back
print('B says hello!')
A_greet_back()
def B_greet_back():
print('B says hello back!')
if __name__ == '__main__':
B_say_hello()
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。