我的图书馆结构如下:
/topmost
/__init__.py
/submodule
/__init__.py
使用
submodule.__init__.py
,有几个函数可以使用全局变量相互通信:import pickle
def function1(input):
global _object1
try:
_object1
except NameError:
_object1 = pickle.load(open('model1.pkl', 'rb'))
return _object1.func1(input)
def function2(input):
global _object2
try:
_object2
except NameError:
_object2 = pickle.load(open('model1.pkl', 'rb'))
# Use function1 to do something to the input
return _object2.func2(function1(input))
对于用户,他们将无法访问
_object1
或_object2
形式的任何内容,并且在topmost
中,仅导入了topmost.__init__.py
中的功能:from __future__ import absolute_import
from topmost.submodule import *
而且,当用户使用
submodule
库时,他们只会看到以下内容:>>> import topmost
>>> topmost.function1('foo bar')
>>> topmost.function2('foo bar bar')
>>> topmost.function1('blah blah black sheep')
调用
topmost
的第一个实例时,解释器应在topmost.function1('foo bar')
范围内插入全局_object1
。但是在topmost.submodule
收到返回值之后,_object1
是否会被破坏?更重要的是,当在上面的用法摘要中调用
topmost.function1
的第二个实例时,是否会重新加载topmost.function1('blah blah black sheep')
? 最佳答案
全局变量持续存在。它们不会被垃圾回收破坏。模块submodule
将保留其设置的全局变量,直到使用del
显式取消设置此类模块全局变量,或者如果模块自身已卸载(通常不会发生)。
但是,您对这种全局变量的使用方式对我来说似乎有点可疑。这不是一种非常干净的代码编写方式。
为什么在导入变量时不设置一般变量?您可以将它们设置为None
并检查它们是否具有此值,而不是捕获NameError
。