11

アプリディレクトリにある utils.py にこの関数を書きました:

from bm.bmApp.models import Client

def get_client(user):
    try:
        client = Client.objects.get(username=user.username)
    except Client.DoesNotExist:
        print "User Does not Exist"
        return None
    else:       
        return client

def to_safe_uppercase(string):
    if string is None:
        return ''
    return string.upper()

次に、models.py ファイルで関数 to_safe_uppercase を使用すると、次のようにインポートします。

from bm.bmApp.utils import to_safe_uppercase 

Pythonエラーが発生しました:

     from bm.bmApp.utils import to_safe_uppercase
ImportError: cannot import name to_safe_uppercase

次のインポートステートメントを変更すると、この問題の解決策が得られました。

from bm.bmApp.utils import *

しかし、なぜこれなのか理解できません。特定の関数をインポートするとエラーが発生するのはなぜですか?

4

3 に答える 3

12

循環インポートと呼ばれるものを実行しています。

models.py:

from bm.bmApp.utils import to_safe_uppercase

ユーティリティ.py:

from bm.bmApp.models import Client

これで、import bm.bmApp.modelsインタープリターは次のことを行います。

  1. models.py - Line 1: インポートを試みますbm.bmApp.utils
  2. utils.py - Line 1: インポートを試みますbm.bmApp.models
  3. models.py - Line 1: インポートを試みますbm.bmApp.utils
  4. utils.py - Line 1: インポートを試みますbm.bmApp.models
  5. ...

最も簡単な解決策は、インポートを関数内に移動することです。

ユーティリティ.py:

def get_client(user):
    from bm.bmApp.models import Client
    try:
        client = Client.objects.get(username=user.username)
    except Client.DoesNotExist:
        print "User Does not Exist"
        return None
    else:       
        return client

def to_safe_uppercase(string):
    if string is None:
        return ''
    return string.upper()
于 2012-04-18T15:54:53.897 に答える
8

循環インポートを作成しています。

utils.py
from bm.bmApp.models import Client
# Rest of the file...

models.py
from bm.bmApp.utils import to_safe_uppercase
# Rest of the file...

循環依存関係がないように、コードをリファクタリングすることをお勧めします (つまり、utils は models.py をインポートする必要はありません)。

于 2012-04-18T15:46:30.000 に答える
0

インポート エラーについて説明できるかどうかわかりませんが、3 つのアイデアがあります。まず、関数を微調整する必要があります。予約語 'string' を引数として使用しました。改名を検討します。

次に、./manage.py シェルを呼び出して手動でインポートするとどうなりますか。それはあなたに違いをもたらしますか?

3 番目に、pyc ファイルを削除して、django に Python コードを強制的に再コンパイルさせます (これは非常に長い方法ですが、削除する価値があります)。

于 2012-04-18T15:44:33.263 に答える