On Wed, Jun 16, 2010 at 12:55 PM, John Nagle <[email protected]> wrote:
> Note that there are now two copies of "a", one bound to the module and
> referenced in "f", and a second bound to the class, and referenced by
> "x.a". Uh oh.
>
> The problem here is that when "def f..." was defined, its reference
> to "a" was bound to the object containing "a" at the time, which is
> the module-level copy of the variable.
>
> I don't think turning a module into a class is going to work.
> Binding the functions into the class won't work, because Python
> doesn't have class-level (as opposed to instance-level) functions.
> If we move x.f into class FakeModule, then "x.f()" is called as
> "f(x)", with an unexpected argument.
>
> Any better ideas? All I really want to do is to override "__setattr__"
> for a module.
It seems to me that a proxy for the actual module would work better.
import sys
class ModuleProxy(object):
def __init__(self, module):
object.__setattr__(self, 'module', module)
def __getattribute__(self, name):
module = object.__getattribute__(self, 'module')
return getattr(module, name)
def __setattr__(self, name, value):
module = object.__getattribute__(self, 'module')
print "setting %s=%s" % (name, value)
setattr(module, name, value)
a = 1
def f():
print a
sys.modules[__name__] = ModuleProxy(__import__(__name__))
Cheers,
Ian
--
http://mail.python.org/mailman/listinfo/python-list