2012-04-18 7 views
9

をmodels.pyのこの方法:私はトンを変更するとき、私はこの問題の解決策を持ってインポートエラーは、私は、アプリdirecrotyに位置utils.pyにこのfuncionを書いた

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

from bm.bmApp.utils import to_safe_uppercase 

私は、Pythonのエラーが発生しました彼は次の文をインポートします:

from bm.bmApp.utils import * 

私はエラーを持っている特定の関数をインポートするとき、なぜ私は理解できないのですか?

+0

これは起こりません。私は何か他のことが起こっていると思う。 – Marcin

+0

残念なことに、djangoはデフォルトでImportErrorsをキャッチし、このerrormessageで置き換えます。それはあなたにトレースバックを与えるように、これは問題を指す必要がありますdjangoにパッチを当ててみてください。私は周期的な輸入などを疑っています。 – ch3ka

+0

@ ch3kaパッチdjangoは素晴らしいアイデアではありません...彼はすでにpythonトレースバックを取得しています。彼は質問の中でそれの一部を貼り付けています – Jiaaro

答えて

0

私はインポートエラーについて説明することはできませんが、3つのアイデアがあります。まず、あなたの関数は微調整が必​​要です。引数として予約語 'string'を使用しました。名前の変更を検討してください。

第2に、./manage.pyシェルを呼び出して手でインポートするとどうなりますか。それはあなたに何かを与えるか?

第三に、Pythonのコードを再コンパイルするジャンゴを強制的にあなたのPYCファイルを削除してみてください(この1つは非常に長いショットです...しかし、排除する価値がある)

+0

私はそれが 'str'だと思った。 – Jiaaro

+0

それはstrです。しかし文字列はstdlibのモジュールです。 – ch3ka

7

あなたは、円形のインポートを作成しています。

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またはその逆をインポートする必要はありません)あなたのリファクタリング、コードをお勧めします。

+0

OPが 'from ... import *'を使用すると、なぜそれは機能しますか? – jadkik94

+0

http://docs.python.org/faq/programming.html#what-are-the-best-practices-for-using-import-in-a-module –

+0

を参照してください。答えに何かを追加することを検討する必要があります。これはOPの質問の一部です。 :) – jadkik94

10

Circularインポートと呼ばれる処理を行っています。

models.py:

from bm.bmApp.utils import to_safe_uppercase 

utils.py:

  1. models.py - Line 1bm.bmApp.utils
  2. をインポートしようとあなたが import bm.bmApp.modelsを行う際インタプリタは次のことを行い今

    from bm.bmApp.models import Client 
    

  3. utils.py - Line 1bm.bmApp.models
  4. models.py - Line 1をインポートしよう:bm.bmApp.utils
  5. utils.py - Line 1をインポートしよう:

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

... bm.bmApp.models

  • をインポートしよう

    utils.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() 
    
  • 関連する問題