On Thu, Apr 2, 2009 at 2:16 PM, Chris Withers <ch...@simplistix.co.uk> wrote: > 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?
That code in socket.py is much older that functools... I don't know if the dependency matters, probably not. But anyways this is moot, the bug was only about exec in a class body *nested inside a function*. -- --Guido van Rossum (home page: http://www.python.org/~guido/) _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com