Funzioni di estensione e "aiuto"
Domanda
Quando chiamo
help(Mod.Cls.f)
(Mod è un modulo di estensione C), ottengo l'output
Help on method_descriptor: f(...) doc_string
Cosa devo fare affinché l'output della guida sia nel formato
Help on method f in module Mod: f(x, y, z) doc_string
come è per random.Random.shuffle, per esempio?
La mia voce PyMethodDef è attualmente:
{ "f", f, METH_VARARGS, "doc_string" }
Soluzione
Non puoi. Il modulo inspect, che è quello che usano 'pydoc' e 'help ()', non ha modo di capire quale sia la firma esatta di una funzione C. Il meglio che puoi fare è quello che fanno le funzioni integrate: includi la firma nella prima riga del docstring:
>>> help(range)
Help on built-in function range in module __builtin__:
range(...)
range([start,] stop[, step]) -> list of integers
...
Il motivo per cui la docstring di random.shuffle sembra " corretto " è che non è una funzione C. È una funzione scritta in Python.
Altri suggerimenti
La risposta di Thomas è giusta, ovviamente.
Aggiungo semplicemente che molti moduli di estensione C hanno un "wrapper" Python intorno a loro in modo che possano supportare firme di funzioni standard e altre caratteristiche del linguaggio dinamico (come il protocollo descrittore).