我有一个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模块?
答案 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