为什么批量导入不起作用但单独导入定义有效?

时间:2009-06-21 06:33:42

标签: python django

所以我刚遇到一个奇怪的所谓的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

我知道以下是更好的编码方式,但是使用模型中提到的所有模型,所以我的问题是,通配符停止工作的可能原因是什么?

我得到的错误是我尝试导入的模型不存在,只有当我删除通配符并导入模型的名称时才能正确导入它。

谢谢!

2 个答案:

答案 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...>

这样做的缺点是即使您不使用它们也会导入所有模块,这意味着它会占用更多内存。