我的图书馆结构如下:
/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')
的第一个实例时,解释器应该启用_object1
范围内的全局topmost.submodule
。 但_object1
收到返回值后,topmost.function1
会被破坏吗?
更重要的是,当在上面的使用情况表中调用topmost.function1('blah blah black sheep')
的第二个实例时,是否会重新加载_object1 = pickle.load(open('model1.pkl', 'rb'))
?
答案 0 :(得分:1)
全局变量挥之不去。它们不会被垃圾收集破坏。模块new Thread(Work).Start();
OR
Thread t = new Thread(WriteB); t.Start();
将保留其设置的全局变量,直到使用submodule
显式取消设置此模块全局变量,或者模块是否自动卸载,这通常不会发生。
但是,以这种方式使用全局变量对我来说有点可疑。它不是一种非常干净的编写代码的方式。
为什么不在导入变量时一般设置变量?您可以将它们设置为del
并检查它们是否具有此值而不是捕获None
。
答案 1 :(得分:0)
正如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))