如何在导入的Python模块中覆盖常量?

时间:2012-09-19 13:45:55

标签: python module python-import

在我的应用程序中,我使用名为example的包examplemod中的模块。

我的应用

from example import examplemod
examplemod.do_stuff()

它会像example那样导入另一个模块。

examplemod.py:

from example import config
# uses config
# then does stuff

config使用常量。

config.py:

CONSTANT = "Unfortunate value"

当我在我的应用程序中使用examplemod(将其设置为CONSTANT = "Better value")时,我想覆盖此常量,并且我不想修改底层模块,所以我不这样做必须保持自己的包。我怎么能这样做?

4 个答案:

答案 0 :(得分:18)

是的,但它只能按预期使用模块的完全限定访问路径:

import example
example.examplemod.config.CONSTANT = "Better value"
example.examplemod.do_stuff()

答案 1 :(得分:7)

谢谢大家的回答。他们指出了正确的方向,尽管他们都没有像书面那样工作。我最终做了以下事情:

import example.config
example.config.CONSTANT = "Better value"

from example import examplemod
examplemod.do_stuff()
# desired result!

(另外,我正在向模块维护者提交补丁,以使CONSTANT成为可配置选项,因此我不必这样做,但需要同时安装库存模块。)

答案 2 :(得分:1)

我不确定这是否足够,但你是否尝试过:

from example import config
config.CONSTANT = "A desirable value"

确保在导入examplemod之前执行此操作。这应该有效,因为python缓存导入,因此您修改的config将与examplemod获得的{{1}}相同。

答案 3 :(得分:1)

这被称为monkey patching,虽然不是首选,但如果还有另一种方法可以完成同样的事情,那么它很常见:

examplemod.config.CONSTANT = "Better value"

问题在于您依赖于examplemodconfig的内部结构保持不变,因此如果任一模块发生更改,这可能会中断。