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

时间:2017-05-11 07:50:02

标签: python garbage-collection global-variables pickle

我的图书馆结构如下:

/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')的第一个实例时,解释器应该启用_object1范围内的全局topmost.submodule_object1收到返回值后,topmost.function1会被破坏吗?

更重要的是,当在上面的使用情况表中调用topmost.function1('blah blah black sheep')的第二个实例时,是否会重新加载_object1 = pickle.load(open('model1.pkl', 'rb'))

2 个答案:

答案 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))