pythonインポートサイクルの問題

4786 ワード

djangoで関数を呼び出すと、エラーが表示されます.
can't import get_user_info

発見して、このモジュールを導入して、どうして導入が成功しませんか?ヒントとして,ループを導入する問題である.「Pythonコアプログラミング」モジュールのインポートサイクルの章を開くと、見ればわかります.
単純なシーンをシミュレート
a.pyにはb.pyの関数b()を呼び出す関数a()があり、b.pyの関数c()はa()を呼び出す必要があり、ループインポートが発生します.コードは次のとおりです.
from b import b
print '---------this is module a.py----------'
def a():
    print "hello, a"   
    b()

a()
from a import a
print '----------this is module b.py----------'
def b():
    print "hello, b"

def c():
    a()

c()

実行:python a.py、エラーは次のとおりです.
zy@zy:~/code/python/test/import$ python a.py
Traceback (most recent call last):
  File "a.py", line 1, in <module>
    from b import b
  File "/home/zy/code/python/test/import/b.py", line 1, in <module>
    from a import a
  File "/home/zy/code/python/test/import/a.py", line 1, in <module>
    from b import b
ImportError: cannot import name b

a.pyにb.b()をインポートし、bファイルをインポートするときにaファイルをインポートし、aファイルにbファイルをインポートするのはデッドサイクルであり、当然許されない.
解決方法:
  • モジュールにインポートされた文をローカル(関数)に配置できます.
  • print '---------this is module a.py----------'
    def a():
        print "hello, a"
        from b import b 
        b()
    
    a()
    rint '----------this is module b.py----------'
    def b():
        print "hello, b"
    
    def c():
        from a import a
        a()
    
    c()

    実行:python a.py、結果は次のとおりです.
    zy@zy:~/code/python/test/import$ python a.py
    ---------this is module a.py----------
    hello, a
    ----------this is module b.py----------
    ---------this is module a.py----------
    hello, a
    hello, b
    hello, a
    hello, b
    hello, b