Pergunta
Quando eu chamar
help(Mod.Cls.f)
(Mod é um módulo de extensão C), recebo a saída
Help on method_descriptor: f(...) doc_string
O que eu preciso fazer para que a saída de ajuda é da forma
Help on method f in module Mod: f(x, y, z) doc_string
como é para random.Random.shuffle, por exemplo?
entrada My PyMethodDef é atualmente:
{ "f", f, METH_VARARGS, "doc_string" }
Solução
Você não pode. O módulo inspecionar, que é o que 'pydoc' e 'help ()' use, não tem nenhuma maneira de descobrir o que a assinatura exata de uma função C é. O melhor que você pode fazer é o que as funções internas fazer: incluir a assinatura na primeira linha da docstring:
>>> help(range)
Help on built-in function range in module __builtin__:
range(...)
range([start,] stop[, step]) -> list of integers
...
docstring A razão de random.shuffle parece "correta" é que ele não é uma função C. É uma função escrita em Python.
Outras dicas
A resposta de Thomas é certo, é claro.
Gostaria apenas de acrescentar que muitos módulos de extensão C tem um "wrapper" Python em torno deles para que eles possam suportar assinaturas de função padrão e outros recursos de linguagem dinâmica (como o protocolo de descritor).