我的图书馆结构如下:

/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

10-04 22:21
查看更多