我的库结构如下:
/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
中,仅导入了submodule
的功能:
from __future__ import absolute_import
from topmost.submodule import *
当用户使用 topmost
库时,他们只会接触到:
>>> import topmost
>>> topmost.function1('foo bar')
>>> topmost.function2('foo bar bar')
>>> topmost.function1('blah blah black sheep')
当调用topmost.function1('foo bar')
的第一个实例时,解释器应在topmost.submodule
范围内启动全局_object1
。但是,topmost.function1
收到返回值后,_object1
会被销毁吗?
更重要的是,当在上面的使用代码段中调用第二个topmost.function1('blah blah black sheep')
实例时,是否会重新加载_object1 = pickle.load(open('model1.pkl', 'rb'))
?
全局变量挥之不去。 它们不会被垃圾回收破坏。 模块submodule
将保留其设置的全局变量,直到使用del
显式取消设置这样的模块全局变量,或者如果模块自身被卸载,这通常不会发生。
不过,您以这种方式使用全局变量对我来说看起来有点可疑。 这不是一种非常干净的代码编写方式。
为什么不在导入变量时设置变量? 您可以将它们设置为 None
并检查它们是否具有此值,而不是捕获 NameError
s。
正如 Alfe 所暗示的,你以一种奇怪的方式使用全局变量。
如果你必须使用全局变量,我建议你重写代码:
import pickle
_model1 = None # here we define the global we wish to load the
# first time either function is called
def load_model1():
global _model1
if not _model1:
_model1 = pickle.load(open('model1.pkl', 'rb'))
# No need to write two functions for loading model1
return _model1
def function1(input):
return load_model1().func1(input)
def function2(input):
# Use function1 to do something to the input
return load_model1().func2(function1(input))