说我将设置存储在Python文件中,如下所示:
#!/usr/bin/env python
#
# settings.py
import os
LOG_DIR = '/tmp'
LOG_FILE_MAIN = os.path.join(LOG_DIR, 'main.log')
现在,我像这样包含该文件并更改其中一个值:
#!/usr/bin/env python
#
# main.py
import settings
settings.LOG_DIR = '/home/myuser'
当我打印出依赖于(现在已更改)"参考"的变量时变量,我会看到值没有改变。
print(settings.LOG_FILE_MAIN)
将返回:
/tmp/main.log
而不是:
/home/myuser/main.log
我明白为什么会这样(Python已经计算了字符串值),但我需要解决它。除了创建一个类并覆盖__setattr__
函数之外,有没有办法实现所需的结果?
答案 0 :(得分:1)
Python已经已经执行了表达式设置LOG_FILE_MAIN
,并且不会因为您更改其中一个输入而再次设置它。存储表达式的结果,而不是表达式本身。
您必须再次手动设置另一个变量,或者稍后使用函数计算它,前提是始终从LOG_DIR
计算。例如。 LOG_FILE_MAIN
不应该是您设置的一部分,但始终可以根据需要从设置中进行计算。我喜欢像这样的低技术方法,而做要求你覆盖__setattr__
函数,或以其他方式处理作为setter的所有关键属性。
另一种方法是使用formatting operations;将LOG_FILE_MAIN
定义为一个字符串,将整个settings
模块应用为str.format()
call中的关键字参数:
LOG_FILE_MAIN = '{LOG_DIR}/main.log'
然后每当您需要使用LOG_FILE_MAIN
时:
settings.LOG_FILE_MAIN.format(**vars(settings))
可选地应用dir分隔符转换步骤以使其特定于平台。