Is it possible to set a global variable in the main module from an imported module (using a string) in python?
(Yes I know this isn't best practice.)
Ultimately I want it to look something like this:
main.py
import mod
def func():
print('failure')
mod.run(func)
func()
mod.py
def func2():
print('success')
def run(f):
globals()[f.__name__] = func2
The result is 'failure'
because global is relative to the module.
I'm wanting to overwrite the variable func
with func2
, from the module.
Another caveat: the variable func
changes, so I need to refer to it be the f.__name__ string
I'm aware that this approach wouldn't work if the name of func
were changed before it's changed via mod.run(func)
.
My question: Is it possible to change the function in the main module from an imported module, without changing the code in the above example main.py
? If so, how?
Rather than change what the name func
is bound to, you can change the code that function func
is bound to actually executes.
def func2():
print('success')
def run(f):
f.__code__ = func2.__code__
This modifies the actual function object referenced by func
, and only partially using the code above, so further surgery may be needed (e.g. to update func.__name__
to be func2
instead of func
), and you may want to make a real copy of func
before monkey patching it like this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With