2015-11-13 48 views
-4
import sys; 
import os; 
from DB import *; 
import mysql.connector; 

######################################################################## 
class htmlForm(): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     self.db = database(database.east_autoExpire); 

    def maker(self,f): 
     blabla 

def main(f): 
    htmlform = htmlForm(); 
    return htmlform.maker(f) 

當我運行它時,它工作正常。但是,當我通過其他程序調用它時,它給了我全局名稱「數據庫」未定義。但是,它已經被定義在前面!令人沮喪Python全局中的錯誤未定義,但它被定義爲

from DB import *;

+0

你是什麼意思的「頭」? – Kevin

+0

什麼是堆棧跟蹤? –

+3

'import *'→不要那樣做。始終命名您想要使用的導入。正是爲了避免這種頭痛。 – spectras

回答

1

總結評論:一個python模塊只是一個容器,它有一些東西在裏面。

  • import DB創建,當前模塊,一個名爲DBDB模塊參考英寸
  • from DB import database將參考從DB模塊複製到當前模塊。
  • from DB import *將所有在DB模塊中發現的模塊複製到當前模塊(*)中。與上一行沒有任何區別,除非您無法控制導入的內容,所以可能會導入一些您認爲導入但未導入的內容,或者甚至可以覆蓋某些符號。假設,例如,該DB模塊包含:

    sys = 'foo' 
    

    然後你from DB import *將覆蓋import sys'foo'

但是請注意,import DB和其他兩個possibilites之間一個非常重要的區別:第一行使模塊可用。這意味着當您執行DB.database時,此行將在執行該行時在DB模塊中查找database

通常,由於模塊非常靜態,所以沒關係。不過,在您的情況下,DB模塊在您首次導入時似乎沒有database引用。它在稍後創建它。因此,from DB import *將不會複製它,並且from DB import database大聲地失敗。

然後你有兩種選擇:

  • 只是導入模塊,而不是尋找它database,直到你真正想它(import DB再後來DB.database
  • 或推遲進口,直到你需要它(你先做了什麼,把from DB import database放在__init__的方法裏面)。

TLDR:不使用import *,和所有其他問題將變得明顯。

(*)如果定義了DB.__all__,則只會複製這些名稱。

相關問題