[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

Re: Replacing a package with another

Gabriel Genellina

1/27/2008 7:16:00 PM

En Sat, 26 Jan 2008 12:10:03 -0200, J. Pablo Fernández <pupeno@pupeno.com>
escribi�:

> Is it possible to replace one package with another at runtime, that is, I
> have package a.blah which I want instead of b.blah, so I can "inject"
> functionality in an existing package?

It might be done, just assign the replacement functions/classes to the
existing module.
This has the same warnings as the reload() function: already created
objects maintain their original behavior, already imported names from
modules maintain their original value, already bound names to default
arguments maintain their original value, etc.
So it is best to do it as early as possible, but anyway some effects can't
be avoided:

=== a.py ===
default_tax_pct = 21
print "in a, default_tax_pct=",default_tax_pct

def foo():
print "original foo"

def tax(amount, pct=default_tax_pct):
print amount, pct, amount*pct/100

=== path_a.py ===
import a

def foo():
print "other foo"

print "patching a.foo",
a.foo = foo
print a.foo

print "patching a.default_tax_pct",
a.default_tax_pct = 15
print a.default_tax_pct

=== main.py ===
import a
from a import default_tax_pct
import patch_a

print "in main, a.default_tax_pct", a.default_tax_pct
print "in main, default_tax_pct", default_tax_pct
print "calling a.foo:"
a.foo()
print "calling a.tax(100.0):"
a.tax(100.0)

=== output ===
in a, default_tax_pct= 21
patching a.foo <function foo at 0x00A3F0B0>
patching a.default_tax_pct 15
in main, a.default_tax_pct 15
in main, default_tax_pct 21
calling a.foo:
other foo
calling a.tax(100.0):
100.0 21 21.0

--
Gabriel Genellina