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

您正在执行所谓的循环导入。

模型.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

我不确定我能否解释 Import 错误,但我有三个想法。首先,您的功能需要调整。您已使用保留字“字符串”作为参数。考虑重命名。

其次,如果您调用 ./manage.py shell 并手动进行导入,会发生什么情况。它给你带来什么不同吗?

第三,尝试删除你的 pyc 文件以强制 django 重新编译 python 代码(这是一个很长的镜头......但值得消除)

于 2012-04-18T15:44:33.263 回答