2009-06-21 25 views
2

所以我遇到了一個奇怪的所謂的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

什麼是「突然」呢?什麼時候工作和停止工作之間發生了什麼變化?你可以發佈你的模型摘要嗎?顯然,你改變了一些打破進口的東西。 – 2009-06-21 12:05:42

回答

4

也許models模塊有一個__all__它不包括你要找的東西。無論如何,from ... import *從未在生產代碼是一個好主意 - 我們總是意味着import *功能互動探索使用,生產使用。具體導入你需要的模塊 - 使用這個名字來限定屬於那裏的名字 - 你會從長遠來看,大大快樂 - !)

+0

如果我有100個名稱要導入,該怎麼辦? 事情是進口*適用於其他PY文件只是沒有在該文件上。感謝您的輸入壽;) – nubela 2009-06-21 07:54:39

1

有某些情況下在Python其中帶*不會屈服進口任何東西。在你的榜樣,如果tuttobelo.management.models是一個包(即與__init__.py目錄)與文件Preferences.py,ProductVariant.py等在裏面,與明星導入將無法正常工作,除非你已經有顯式導入它別的地方。

這可以通過將在__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...> 

這樣做的缺點是,所有的模塊得到進口的,即使你不使用它們,這意味着它會採取更多的內存。