我在app direcroty上的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()
Run Code Online (Sandbox Code Playgroud)
然后,当我在models.py文件中使用函数to_safe_uppercase时,通过以下方式导入它:
from bm.bmApp.utils import to_safe_uppercase
Run Code Online (Sandbox Code Playgroud)
我得到了python错误:
from bm.bmApp.utils import to_safe_uppercase
ImportError: cannot import name to_safe_uppercase
Run Code Online (Sandbox Code Playgroud)
当我更改import语句时,我得到了这个问题的解决方案:
from bm.bmApp.utils import *
Run Code Online (Sandbox Code Playgroud)
但我无法理解为什么会这样,为什么当我导入特定功能时我得到了错误?
Jia*_*aro 12
您正在执行所谓的循环导入.
models.py:
from bm.bmApp.utils import to_safe_uppercase
Run Code Online (Sandbox Code Playgroud)
utils.py:
from bm.bmApp.models import Client
Run Code Online (Sandbox Code Playgroud)
现在,当您这样做时import bm.bmApp.models,解释器执行以下操作:
models.py - Line 1:尝试导入 bm.bmApp.utilsutils.py - Line 1:尝试导入 bm.bmApp.modelsmodels.py - Line 1:尝试导入 bm.bmApp.utilsutils.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()
Run Code Online (Sandbox Code Playgroud)
您正在创建循环导入.
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...
Run Code Online (Sandbox Code Playgroud)
我建议您的重构代码,以便您没有循环依赖(即utils不需要导入models.py或反之亦然).
我不确定我可以解释导入错误,但我有三个想法。首先,你的函数需要调整。您使用了保留字“string”作为参数。考虑重命名。
其次,如果调用 ./manage.py shell 并手动进行导入,会发生什么。它给你带来什么不同吗?
第三,尝试删除 pyc 文件以强制 django 重新编译 python 代码(这是一个非常遥远的目标......但值得消除)