动态计算字符串值

时间:2014-10-14 16:44:35

标签: python

说我将设置存储在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__函数之外,有没有办法实现所需的结果?

1 个答案:

答案 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分隔符转换步骤以使其特定于平台。