Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Overriding a function...

0 views
Skip to first unread message

progra...@gmail.com

unread,
Jun 19, 2006, 2:42:38 PM6/19/06
to
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

Marc 'BlackJack' Rintsch

unread,
Jun 19, 2006, 3:04:29 PM6/19/06
to
In <1150742558.1...@p79g2000cwp.googlegroups.com>,
progra...@gmail.com wrote:

> 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?

It will not `fix` it. Importing an already imported module doesn't reload
the module.

> 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()?

They see the `override()` function.

Ciao,
Marc 'BlackJack' Rintsch

benb...@gmail.com

unread,
Jun 19, 2006, 3:06:24 PM6/19/06
to

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

K.S.Sreeram

unread,
Jun 19, 2006, 3:32:15 PM6/19/06
to pytho...@python.org
Marc 'BlackJack' Rintsch wrote:
>> 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()?
>
> They see the `override()` function.

That depends on how the import was done.

If you do 'import mymodule' and then use 'mymodule.test' to access the
function, then they'll see the new 'override' function.

Alternatively, If you do 'from mymodule import test', and use 'test',
then they'll see the original 'test' function.

Regards
Sreeram

signature.asc
0 new messages