在我的应用程序中,我使用名为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"
)时,我想覆盖此常量,并且我不想修改底层模块,所以我不这样做必须保持自己的包。我怎么能这样做?
答案 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"
问题在于您依赖于examplemod
和config
的内部结构保持不变,因此如果任一模块发生更改,这可能会中断。