[Python-Dev] issue5578 - explanation

Guido van Rossum guido at python.org
Thu Apr 2 23:18:30 CEST 2009


On Thu, Apr 2, 2009 at 2:16 PM, Chris Withers <chris at 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/)


More information about the Python-Dev mailing list