import

Import函數

下面是包的結構spa

package
├── __init__.py
├── subpackage1
│   ├── __init__.py
│   ├── moduleX.py
│   └── moduleY.py
├── subpackage2
│   ├── __init__.py
│   └── moduleZ.py
└── moduleA.py

咱們如今在moduleX.py中。code

有絕對路徑引入和相對路徑引入兩種方法。相對路徑對於絕對路徑來講優點爲: 當調整模塊和包的時候若是是絕對路徑那麼須要一個個挨着改。絕對路徑對於相對路徑來講優點爲:相對路徑取決於當前的包,因此在哪裏執行就會有不同的難以預料的後果(from . import module error: main is not a package。相對引用的' . '符號對應的就是__name__的值。若是在main函數中執行這個' . '就是__main__而不是上級包名。此時用from baoming import module就能解決)。 下面來導入一些包:[A]表示絕對路徑 | [B]表示相對路徑。it

導入同一個子包下的 moduleYimport

[A] from package.subpackage1 import moduleYmodule

[B] from . import moduleY循環

導入同一個子包下的 moduleY.py中的spam函數引用

[A] from package.subpackage1.moduleY import spam方法

[B] from .moduleY import spamim

從兄弟子包下的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()
相關文章
相關標籤/搜索