【发布时间】:2015-10-19 10:59:27
【问题描述】:
我有一个文件MySQL.py,其中包含一个类MySQL,定义如下:
class MySQL:
... all stuff that is not important here
在同一目录中的其他文件 (test.py) 中,我对这个 MySQL 类进行了条件加载。通过这种条件加载,我的意思是我加载它以防它尚未加载。为了检查它,我像这样使用sys.modules:
print("MySQL" not in sys.modules)
if "MySQL" not in sys.modules:
from MySQL import MySQL
print("Loaded it")
print("MySQL" not in sys.modules)
return MySQL()
如您所见,我有一些print's 用于调试目的。当我运行这个文件时,这就是我在控制台中得到的:
$ python3 test.py
True
Loaded it
False
Traceback ...
...
UnboundLocalError: local variable 'MySQL' referenced before assignment
这真的很有趣,因为在控制台中我们看到,一开始模块没有加载(print("MySQL" not in sys.modules) => True),然后我们看到它被加载了,但最后因为一些疯狂的原因@987654332 @ 没有看到这个类。 PS。我应该补充一点,如果我在文件的最开始导入(在所有其他代码之前,那么一切正常)。
编辑
我想,我明白了,所有麻烦的全部原因是我做import的方式将我的类放到sys.modules,但同时它把它放到函数的本地命名空间而不是模块的全局命名空间。就是这样。
【问题讨论】:
-
您为什么不一开始就导入以使一切正常,就像您应该做的那样?
-
test.py中的代码是否在函数内部?如果是这样,您还没有第二次导入MySQL,因此它不存在于本地或全局命名空间中,从而导致问题。 -
为什么你在做“条件加载”?如果它已经加载,那么
import就变成了在sys.modules中的一个简单查找。 -
@Anand S Kumar。是的,该代码在函数内部,返回语句也在该函数内部
-
很遗憾,您的问题是XY Problem。你已经有了干净、有效的代码——除非/直到有必要,否则不要乱用它。
标签: python