Funciones de extensión y 'ayuda'
Pregunta
Cuando llamo
help(Mod.Cls.f)
(Mod es un módulo de extensión C), obtengo el resultado
Help on method_descriptor: f(...) doc_string
¿Qué debo hacer para que el resultado de la ayuda sea del formulario
Help on method f in module Mod: f(x, y, z) doc_string
como para random.Random.shuffle, por ejemplo?
La entrada de Mi PyMethodDef es actualmente:
{ "f", f, METH_VARARGS, "doc_string" }
Solución
No puedes. El módulo de inspección, que es lo que usan 'pydoc' y 'help ()', no tiene forma de averiguar cuál es la firma exacta de una función en C. Lo mejor que puede hacer es lo que hacen las funciones integradas: incluir la firma en la primera línea de la cadena de documentos:
>>> help(range)
Help on built-in function range in module __builtin__:
range(...)
range([start,] stop[, step]) -> list of integers
...
La cadena de documentos de random.shuffle se ve " correcta " es que no es una función de C. Es una función escrita en Python.
Otros consejos
La respuesta de Thomas es correcta, por supuesto.
Simplemente agregaría que muchos módulos de extensión C tienen un envoltorio de Python " " alrededor de ellos para que puedan admitir firmas de funciones estándar y otras funciones de lenguaje dinámico (como el protocolo del descriptor).