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



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

我的应用:

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" ),并且我不想修改底层模块,这样我就不必维护自己的包。我该怎么做?

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

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

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

import example.config
example.config.CONSTANT = "Better value"
from example import examplemod
examplemod.do_stuff()
# desired result!

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

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

examplemod.config.CONSTANT = "Better value"

问题是您依赖于examplemod的内部结构,并且config保持不变,因此如果任何一个模块发生变化,这可能会中断。

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

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

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

最新更新