[Python-Dev] issue5578 - explanation
Chris Withers
chris at simplistix.co.uk
Thu Apr 2 23:16:28 CEST 2009
R. David Murray wrote:
> On Wed, 1 Apr 2009 at 13:12, Chris Withers wrote:
>> Guido van Rossum wrote:
>>> Well hold on for a minute, I remember we used to have an exec
>>> statement in a class body in the standard library, to define some file
>>> methods in socket.py IIRC.
>>
>> But why an exec?! Surely there must be some other way to do this than
>> an exec?
>
> Maybe, but this sure is gnarly code:
>
> _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
> "%s.__doc__ = _realsocket.%s.__doc__\n")
> for _m in _socketmethods:
> exec _s % (_m, _m, _m, _m)
> del _m, _s
I played around with this and managed to rewrite it as:
from functools import partial
from new import instancemethod
def meth(name,self,*args):
return getattr(self._sock,name)(*args)
for _m in _socketmethods:
p = partial(meth,_m)
p.__name__ = _m
p.__doc__ = getattr(_realsocket,_m).__doc__
m = instancemethod(p,None,_socketobject)
setattr(_socketobject,_m,m)
Have I missed something or is that a suitable replacement that gets rid
of the exec nastiness?
Chris
--
Simplistix - Content Management, Zope & Python Consulting
- http://www.simplistix.co.uk
More information about the Python-Dev
mailing list