tags:

views:

62

answers:

2

When I call

help(Mod.Cls.f)

(Mod is a C extension module), I get the output

Help on method_descriptor:

f(...)
    doc_string

What do I need to do so that the help output is of the form

Help on method f in module Mod:

f(x, y, z)
    doc_string

like it is for random.Random.shuffle, for example?

My PyMethodDef entry is currently:

{ "f", f, METH_VARARGS, "doc_string" }
+2  A: 

You cannot. The inspect module, which is what 'pydoc' and 'help()' use, has no way of figuring out what the exact signature of a C function is. The best you can do is what the builtin functions do: include the signature in the first line of the docstring:

>>> help(range)
Help on built-in function range in module __builtin__:

range(...)
    range([start,] stop[, step]) -> list of integers

...

The reason random.shuffle's docstring looks "correct" is that it isn't a C function. It's a function written in Python.

Thomas Wouters
Thanks, but why does it say method_descriptor rather than the name of the method and module?
James Hopkin
Because that's what Python thinks the object is -- because that's what it is. See 'help(list.append)' and you'll see the same thing.
Thomas Wouters
Ah, I see ... help(list.sort) does exactly the same. If it's good enough for list.sort, it's good enough for me :-)
James Hopkin
+1  A: 

Thomas's answer is right on, of course.

I would simply add that many C extension modules have a Python "wrapper" around them so that they can support standard function signatures and other dynamic-language features (such as the descriptor protocol).

Dan