所以我刚遇到一个奇怪的所谓的bug。因为这可以在我的其他.py文件上工作,但只是在这个文件上它突然停止工作。
from tuttobelo.management.models import *
以上常用,但它突然停止工作,我不得不用底部更换。
from tuttobelo.management.models import Preferences, ProductVariant, UserSeller, ProductOwner, ProductModel, ProductVariant
from tuttobelo.management.models import ProductMeta, ShippingMethods
我知道以下是更好的编码方式,但是使用模型中提到的所有模型,所以我的问题是,通配符停止工作的可能原因是什么?
我得到的错误是我尝试导入的模型不存在,只有当我删除通配符并导入模型的名称时才能正确导入它。
谢谢!
答案 0 :(得分:4)
也许models
模块有__all__
,但不包含您要查找的内容。无论如何,from ... import *
从不在生产代码中是一个好主意 - 我们始终指的是import *
功能,用于交互式探索性使用,不生产使用。具体来说,导入你需要的模块 - 使用该名称来限定属于那里的名字 - 从长远来看,你会非常快乐! - )
答案 1 :(得分:1)
在Python中有些情况下使用*导入不会产生任何结果。在您的示例中,如果tuttobelo.management.models是包含文件Preferences.py,ProductVariant.py等的包(即具有__init__.py
的目录),则使用star导入将无效,除非您已经已在其他地方明确导入。
这可以通过加入__init__.py
:
__all__ = ['Preferences', 'ProductVariant', 'UserSeller', <etc...> ]
这样可以再次进行导入*,但如上所述,由于多种原因,这是一种可怕的编码风格。一,像pyflakes和pylint这样的工具,以及编辑器中的代码内省,都会停止工作。其次,你最终在本地命名空间中放了很多名字,在你的代码中你不知道它们来自哪里,其次你可以在这样的名字中发生冲突。
更好的方法是
from tuttobelo.management import models
然后通过models.Preferences,models.ProductVariant等参考其他内容。但是这不适用于__all__
变量。相反,您需要从__init__.py
:
import Preferences, ProductVariant, UserSeller, ProductOwner, <etc...>
这样做的缺点是即使您不使用它们也会导入所有模块,这意味着它会占用更多内存。