23

在我的应用程序中,我在example名为examplemod.

我的应用程序:

from example import examplemod
examplemod.do_stuff()

它像这样导入另一个模块example

例子mod.py:

from example import config
# uses config
# then does stuff

config使用常数。

配置文件:

CONSTANT = "Unfortunate value"

我想examplemod在我的应用程序中使用时覆盖这个常量(将其设置为CONSTANT = "Better value"),并且我不想修改底层模块,因此我不必维护自己的包。我怎样才能做到这一点?

4

4 回答 4

24

是的,但它只能在完全限定的模块访问路径下按预期工作:

import example
example.examplemod.config.CONSTANT = "Better value"
example.examplemod.do_stuff()
于 2012-09-19T13:52:58.450 回答
13

谢谢大家的答案。他们为我指明了正确的方向,尽管他们都没有按书面规定工作。我最终做了以下事情:

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

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

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

于 2012-09-19T14:27:30.300 回答
2

这称为猴子补丁,如果有另一种方法来完成相同的事情,它是相当常见的,但不是首选:

examplemod.config.CONSTANT = "Better value"

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

于 2012-09-19T13:52:16.090 回答
1

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

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

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

于 2012-09-19T13:49:49.163 回答