Metaclass to make all methods of a class thread-safe
Irmen de Jong
irmen at -nospam-remove-this-xs4all.nl
Mon Sep 27 15:22:48 EDT 2004
Michele Simionato wrote:
> Irmen de Jong <irmen at -nospam-remove-this-xs4all.nl> wrote in message news:<415728eb$0$78753$e4fe514c at news.xs4all.nl>...
[...]
>>Is this the right approach? It seems to work fine. But I have
>>very little experience with metaclass programming, so I'd like
>>to hear some feedback.
>>
>>Thanks !!
>>
>>--Irmen de Jong.
>
>
> Well, it looks okay, but consider the following:
>
> 1. you have a (metaclass) static method and a (metaclass) classmethod
> which could be replaced by simple functions external to the metaclass;
> this would make the code much easier to read and to understand; I don't
> buy the argument that they should logically stay in the metaclass, it
> is enough if they stay in the same module of the metaclass, not inside it;
Agreed, I was just modeling it after some example metaclass code that I found
on ASPN cookbook. The metaclass itself will only be a few lines then :-)
> 2. the metaclass will automagically wrap even methods of subclasses, without
> you knowing it; consider using a naming convention (es. only methods
> starting with "t_" are magically wrapped); if still
> you want the magic, consider defining a name convention such as methods
> starting with a given prefix are NOT magically wrapped;
This is good advice. I started by not wrapping methods with '__' prefix...
> 4. built-in methods and all the objects which are non instances of FunctionType
> will be not wrapped; you may want this or not;
Built-in methods such as?
About the other objects: I only cared about wrapping class methods.
Shouldn't I have / should I use something else than FunctionType?
There is one thing though; methods that you're accessing trough the
class's __dict__ (which is what the meta class is doing, right?)
are of type <function>, rathar than <instancemethod> which I expected:
>>> class A:
... def meth(self): pass
...
>>> type(A.meth)
<type 'instancemethod'>
>>> type(A.__dict__['meth'])
<type 'function'>
>>>
Why is this?
> 5. consider using decorators to wrap the methods you want to be
> thread safe: they a more esplicit and easier to understand solution;
> also in this way you will avoid the (possible) issue of metaclass
> conflicts.
No decorators, nooo sir, it must work on Python 2.3 too :)
> 6. However, if you want to enhance a code which is already written
> with a minimal change of the source code, the metaclass is the
> simplest solution indeed.
Thanks for your comments, Michele.
--Irmen
More information about the Python-list
mailing list