令人沮丧的Python全局中没有定义Bug,但它是定义的

时间:2015-11-13 17:13:58

标签: python

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)

当我运行它时,它工作正常。但是,当我通过其他程序调用它时,它给了我全局名称"数据库"没有定义。但是,它已经提前确定了!

来自DB import *;

1 个答案:

答案 0 :(得分:2)

总结评论:python模块只是一个容器,里面有一些东西。

  • import DB在当前模块中为DB模块创建名为DB的引用。
  • from DB import database将引用从DB模块复制到当前模块中。
  • from DB import *DB模块中找到的所有内容复制到当前模块(*)中。除了您无法控制导入的内容之外,与前一行没有区别,因此您可能认为某些内容是导入但未导入,或者您甚至可以覆盖某些符号。例如,假设DB模块包含:

    sys = 'foo'
    

    然后,您的from DB import *将使用import sys

  • 覆盖您的'foo'

但请注意,import DB与其他两个可能性之间存在非常重要的区别:第一行使模块可用。这意味着当您执行DB.database时,这将在执行该行时在database模块中查找DB

通常,由于模块非常静态,因此无关紧要。但是,在您的情况下,DB模块在​​您第一次导入时似乎没有database引用。它会在以后创建它。因此,from DB import *不会复制它,from DB import database会大声失败。

您有两个选择:

  • 只需导入该模块,在您真正需要它之前不要查找该模块database,然后再import DB}
  • 或推迟导入,直到您需要它为止(您先做了什么,将DB.database放在from DB import database方法中)。

TLDR :不要使用__init__,所有其他问题都会变得明显。

(*)如果定义了import *,则只会复制这些名称。