每次调用函数时,子模块中的全局变量是否会重新加载



我的库结构如下:

/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_object2topmosttopmost.__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))

相关内容

  • 没有找到相关文章

最新更新