Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I override a constant in an imported Python module?

Tags:

In my application I am using module within the package example called examplemod.

My app:

from example import examplemod
examplemod.do_stuff()

It imports another module within example like so.

examplemod.py:

from example import config
# uses config
# then does stuff

config uses a constant.

config.py:

CONSTANT = "Unfortunate value"

I'd like to override this constant when I'm using examplemod in my application (setting it to CONSTANT = "Better value") and I'd prefer not to modify the underlying module so I don't have to maintain my own package. How can I do this?

like image 563
Dave Forgac Avatar asked Sep 19 '12 13:09

Dave Forgac


4 Answers

Yes, but it'll only work as expected with fully qualified access paths to modules:

import example
example.examplemod.config.CONSTANT = "Better value"
example.examplemod.do_stuff()
like image 194
vartec Avatar answered Oct 16 '22 11:10

vartec


Thank you all for your answers. They pointed me in the right direction though none of them worked as written. I ended up doing the following:

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

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

(Also, I'm submitting a patch to the module maintainer to make CONSTANT a configurable option so I don't have to do this but need to install the stock module in the mean time.)

like image 32
Dave Forgac Avatar answered Oct 16 '22 10:10

Dave Forgac


This is called monkey patching, and it's fairly common although not preferred if there's another way to accomplish the same thing:

examplemod.config.CONSTANT = "Better value"

The issue is that you're relying on the internals of examplemod and config remaining the same, so this could break if either module changes.

like image 43
ecatmur Avatar answered Oct 16 '22 11:10

ecatmur


I'm not sure if this is enough or not, but did you try:

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

Make sure to do this before examplemod is imported. This should work because python caches imports so the config that you modified will be the same one that examplemod gets.

like image 31
ubershmekel Avatar answered Oct 16 '22 10:10

ubershmekel