Overriding "__setattr__" of a module - possible?

John Nagle nagle at animats.com
Wed Jun 16 17:38:31 EDT 2010


On 6/16/2010 1:10 PM, Ian Kelly wrote:
> On Wed, Jun 16, 2010 at 12:55 PM, John Nagle<nagle at animats.com>  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

That just leaves things in a state where even "sys" and "import"
are undefined.

					John Nagle




More information about the Python-list mailing list