2012-09-19 35 views
8

在我的应用程序中,我使用example包中的模块examplemod如何覆盖导入的Python模块中的常量?

我的应用程序:

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")来覆盖这个常数,我宁愿不修改基础模块,所以我不必维护我自己的软件包。我怎样才能做到这一点?

+0

我可能是错的,但我认为你可以给变量赋值一旦它被导入。 – Borgleader

回答

3

谢谢大家对你的答案。他们指出我的方向是正确的,尽管他们都没有写作。最后我做了以下内容:

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

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

(另外,我提交了一个补丁模块维护者,使常数的配置选项,所以我没有这样做,但需要安装枪托模块同时)。

1

我不知道这是否足够,但你尝试:

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

确保examplemod导入之前做到这一点。这应该工作,因为python缓存进口,所以您修改的config将与examplemod获得的相同。

1

这就是所谓的monkey patching,这是相当普遍的,虽然如果有另一种方式来完成同样的事情不理想:

examplemod.config.CONSTANT = "Better value" 

的问题是,你是依靠examplemod的内部和config剩余相同,所以这可能会中断,如果任何模块更改。

12

是的,但与完全合格的访问路径有望模块它只会工作:

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

另外值得一提的是,如果exam​​plemod模块使用'from config import CONSTANT'语法直接将CONSTANT导入其符号表中,则需要执行'example.examplemod.CONSTANT =“Better value”',因为examplemod会有它自己参考了CONSTANT。您正在使用的表单替换config.CONSTANT,它适用于examplemod模块正在使用'from examplemod import config; config.CONSTANT'。 – Symmetric