Sort of an odd way to debug...
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Wed Sep 5 19:46:09 EDT 2007
En Wed, 05 Sep 2007 02:15:52 -0300, Alex Martelli <aleax at mac.com> escribi�:
> xkenneth <xkenneth at gmail.com> wrote:
> ...
>> What I'd like to do, is define a base class. This base class would
>> have a function, that gets called every time another function is
>> called (regardless of whether in the base class or a derived class),
>> and prints the doc string of each function whenever it's called. I'd
>> like to be able to do this without explicitly specifying the function
>> inside all of the other functions of a base class or derived class.
>
> So you need to write a metaclass that wraps every function attribute of
> the class into a wrapper performing such prints as you desire. [...]
>
> import inspect
> class MetaWrapFunctions(type):
> def __init__(cls, name, bases, attrs):
> for k, f in attrs.iteritems():
> if inspect.isfunction(f):
> attrs[k] = make_printing_wrapper(f)
> type.__init__(cls, name, bases, attrs)
>
> Should behave as you described. I have not tested the code I'm
> suggesting (so there might be some errors of detail) but the general
> idea should work.
After playing a bit with the code I found a problem, __init__ is too late,
changes to `attrs` are not reflected in the class namespace. Using __new__
instead is OK. The metaclass should be then:
import inspect
class MetaWrapFunctions(type):
def __new__(cls, name, bases, attrs):
for k, f in attrs.iteritems():
if inspect.isfunction(f):
attrs[k] = make_printing_wrapper(f)
return super(MetaWrapFunctions, cls).__new__(cls, name, bases,
attrs)
[another way would be to keep __init__ but using setattr(cls, k,
wrapper(...)]
--
Gabriel Genellina
More information about the Python-list
mailing list