[Python-Dev] (no subject)

Thomas Heller theller at python.net
Mon Mar 14 16:35:43 CET 2005


"Phillip J. Eby" <pje at telecommunity.com> writes:

> At 05:34 AM 3/14/05 -0800, Michael Chermside wrote:
>>Nice... thanks. But I have to ask: is this really the right set of metadata to
>> be updating? Here are a few things that perhaps ought be copied by
>> update_meta:
>>
>>     f.__name__     (already included)
>>     f.__doc__      (already included)
>>     f.__dict__     (already included)
>>     f.__module__   (probably should include)
>>     f.func_code.co_filename     (to match f.__name__, but I'd leave it alone)
>
> Leave __module__ alone, too, unless you want to play havoc with any
> inspection tools looking for the source code.
>
>
>>there's also the annoying fact that in IDLE (and in some other python-aware
>>IDEs) one can see the argument signature for a function as a "tool tip"
>>or other hint. Very handy that, but if a decorator is applied then all
>>you will see is "func(*args, **kwargs)" which is less than helpful. I'm
>>not sure whether this CAN be duplicated... I believe it is generated by
>>examining the following:
>>
>>     f.func_code.co_argcount
>>     f.func_code.co_varnames
>>     f.func_code.co_flags & 0x4
>>     f.func_code.co_flags & 0x8
>>
>>...and I suspect (experimentation seems to confirm this) that if you mangle
>>these then the code object won't work correctly. If anyone's got a
>>suggestion for fixing this, I'd love to hear it.
>
> One solution is to have a __signature__ attribute that's purely
> documentary.  That is, modifying it wouldn't change the function's
> actual behavior, so it could be copied with update_meta() but then
> modified by the decorator if need be.  __signature__ would basically
> be a structure like the one returned by inspect.getargspec().  Also,
> 'instancemethod' would have a __signature__ equal to its
> im_func.__signature__ with the first argument dropped off, thus making
> it easy to introspect wrapper chains.

Another possibility (ugly, maybe) would be to create sourcecode with the
function signature that you need, and compile it. inspect.getargspec() and
inspect.formatargspec can do most of the work.

Thomas



More information about the Python-Dev mailing list