Overriding a function...

benboals at gmail.com benboals at gmail.com
Mon Jun 19 21:06:24 CEST 2006


programmer.py at gmail.com wrote:
> Suppose I have this module `mymodule.py' -
>
> # mymodule.py - begin
> def test():
>     print "original"
> # mymodule.py - end
>
> Now assume that I do this in some arbitrary module ->
>
> def override():
>     print "test is overridden"
>
> import mymodule
> mymodule.test = override
>
> Two questions -
>
> 1) If mymodule is subsequently imported, will my `override' function be
> used, or will python magically `fix' (or break depending on your
> perspective) mymodule and use the original mymodule.test function?
>
> 2) Once I assign mymodule.test with override, will modules that
> imported my module *PRIOR* to the assignment get override, or will they
> keep the original function test()?
>
> I hope that makes sense.
>
> Thanks!
> jw

iirc, python only imports modules once, so for future imports should be
ok with the override. There is a reload() function that wipes and
reloads a module(though not, I believe, recursively, that is, not
modules that it imported)  I've done someting similar to your
overwriting in the past, anyway, and it worked.

However, you should find this easy to test yourself, in case the
revision makes a difference.
How i'd test it:

file: original
def afunction(): print 'Hi'

file: changer
import original
def otherFunc(): print "Bye"
original.afunction()=otherFunc

file: final1
import original
original.afunction()  ##should say hi
import changer
original.afunction() ##should say bye
changer.original.afunction() ##should still say bye.


file: final2
import changer
changer.original.afunction() ##should say bye
import original
changer.original.afunction() ##should say bye
original.afunction() ##should say bye

cmd prompt:
python final1.py
Expect:  
Hi
Bye
Bye

python final2.py
Expect:
Bye
Bye
Bye




More information about the Python-list mailing list