Erik Johnson wrote: > Maybe I just don't know the right special function, but what I am wanting to > do is write something akin to a __getattr__ function so that when you try to > call an object method that doesn't exist, it get's intercepted *along with > it's argument*, in the same manner as __getattr__ intercepts attributes > references for attributes that don't exist. > > > This doesn't quite work: > > >>> class Foo: > ... def __getattr__(self, att_name, *args): > ... print "%s%s" % (att_name, str(tuple(*args))) > ... > >>> f = Foo()
The problem is that the call to f.bar happens in two stages: the interpreter calls getattr(f, "foo") to get a function, and then it calls that function. When __getattr__ is called, you can't tell what the parameters of the function call will be, or even if it'll be called at all - someone could have run "print f.bar". Instead, you can make __getattr__ return a function. Then *that* function will be called as f.bar, and you can print out its arguments there: class Foo: def __getattr__(self, attr): def intercepted(*args): print "%s%s" % (attr, args) return intercepted -- http://mail.python.org/mailman/listinfo/python-list