为了在整个程序中最小化硬编码值,我定义了一组常量,如下所示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
但当我尝试import Constants
在另一个 python 文件中时,我得到了原始的Constants.BAR
.
除了根本不工作之外,使用__import__()
似乎特别难看,所以我想有一种适当的方法可以覆盖特定设置的导出常量?