你不能通過**locals()去參加活動,是嗎?
因為Python缺少一個“包含”語句,和這個self參數是顯式的,和范圍規則非常簡單,通常很容易將手指指向一個變量并判斷該對象來自何處-不需要讀取其他模塊,也不需要任何IDE(因為語言非常動態,這在自省方面是有限的)。
這個import *打破了所有這些。
此外,它還具有隱藏bug的具體可能性。
import os, sys, foo, sqlalchemy, mystufffrom bar import *
現在,如果BAR模塊有任何“os", "mystuff“,等等.屬性,它們將覆蓋顯式導入的屬性,并可能指向非常不同的內容。__all__在BAR中通常是明智的-這說明了將隱式導入的內容-但是,如果不讀取和解析BAR模塊并遵循以下步驟,仍然很難跟蹤對象來自何處它的進口品。網絡import *當我擁有一個項目時,第一件事就是修復。
別誤會我:如果import *如果失蹤了,我會哭著要它。但必須謹慎使用。一個好的用例是在另一個模塊上提供一個Facade接口。同樣,使用條件導入語句,或者在函數/類命名空間中導入,需要遵守一些規則。
我認為,在中等到大型的項目中,或者有幾個貢獻者的小項目中,在靜態分析中需要最少的衛生-至少運行一片熱片,或者更好地運行一個配置得當的化纖板-以便在它們發生之前捕捉到幾種bug。
當然,既然這是python-你可以自由地打破規則,去探索-但是要小心那些可能會增長十倍的項目,如果源代碼缺少紀律,這將是一個問題。