【发布时间】:2013-02-13 19:06:39
【问题描述】:
为了最小化整个程序中的硬编码值,我定义了一组常量,如下面的Constants.py:
FOO = 42
HOSTNAME=socket.gethostname()
BAR = 777
所有想要使用这些常量的模块,只需执行import Constants 并立即使用Constants.FOO。
现在其中一些常量可能取决于程序运行的实际主机。
因此,我想根据应用程序运行的实际环境有选择地覆盖其中的一些。
第一次粗略的尝试如下Constants.py:
FOO = 42
HOSTNAME=socket.gethostname()
if HOSTNAME == 'pudel':
BAR = 999
elif HOSTNAME == 'knork'
BAR = 888
else:
BAR = 777
虽然这可以正常工作,但它会使文件因特殊情况而变得混乱,我想避免这种情况。
如果我正在编写 shell 脚本,我会使用类似 Constants.sh:
FOO = 42
HOSTNAME=$(hostname)
BAR = 777
# load host-specific constants
if [ -e Constants_${HOSTNAME}.sh ]; then
. Constants_${HOSTNAME}.sh
fi
还有一个可选的Constants_pudel.sh,看起来像:
BAR = 999
将公共常量放在一起,并允许在单独的文件中轻松覆盖它们。
由于我编写的不是 shell 脚本而是 python 程序,所以我想知道如何获得相同的结果。
无济于事,我尝试了类似的方法:
FOO = 42
HOSTNAME=socket.gethostname()
BAR = 777
try:
__import__('Constants_'+HOSTNAME)
except ImportError:
pass
Constants_poodle.py 看起来像:
import Constants
Constants.BAR = 999
这工作正常,在Constants_poodle 中,但是当我尝试在另一个python 文件中import Constants 时,我得到了原始的Constants.BAR。
除了根本不工作之外,使用__import__() 似乎特别难看,所以我想有一种适当的方法可以覆盖特定设置的导出常量?
【问题讨论】:
-
这些常量可能取决于程序运行的实际主机。那么它们就不是常量了……
-
好吧,我认为它们在给定的上下文中是不变的。但请随意编辑问题,为这些 constants 提供更好的措辞
标签: python constants overriding