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()

coolxc
27 声望1 粉丝

ooooooooooooooooooooolxc