在python中覆盖使用其他模块变量的模块变量

时间:2016-11-28 14:19:49

标签: python-3.x variables module

我有一个python模块,我存储我的设置settings.py。此文件包含

之类的行
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
BASE_URL = 'https://my-base-url.com/test'
...
SCORM_TEST_URL = BASE_URL + '/scorm2004testwrap.htm'

我想允许用户覆盖这些设置,例如通过使用命令行选项或环境变量。当我做

时,它适用于直接变量赋值
import settings
settings.BASE_URL = 'test'

然而

settings.SCORM_TEST_URL 
#will print https://my-base-url.com/test/scorm2004testwrap.htm

有没有办法告诉python使用重写的值更新这些因变量?或者我如何设计我的程序,它允许覆盖设置以及在python模块的文件中设置变量,因为你看到它可能需要在上面的例子中导入像os的其他python模块?

1 个答案:

答案 0 :(得分:0)

似乎这不是可行的事情

当你设置setting.BASE_URL = something时,它会被重新分配给现在的东西,而之前的任何值都消失了,所以它可以工作。

SCORM_TEST_URL是基于旧BASE_URL值创建的,一旦创建它就与BASE_URL无关。因此,更改BASE_URL不会反映在{{ 1}}除非您根据新的SCORM_TEST_URL值重新评估它。

我可以想到如下的一些解决方法,声明那些需要像往常一样修改外部模块的变量。

在更新函数中放入另一组需要更新的变量,并将它们设为全局

在settings.py内部

BASE_URL

从其他模块,像往常一样导入设置

BASE_URL = 'https://my-base-url.com/test'
# ... other var

def update_var():
    global SCORM_TEST_URL
    SCORM_TEST_URL = BASE_URL + '/scorm2004testwrap.htm'
    # added other var accordingly