Функции расширения и «помощь» - PullRequest
1 голос
/ 30 сентября 2008

Когда я звоню

help(Mod.Cls.f)

(Мод - это модуль расширения C), я получаю вывод

Help on method_descriptor:

f(...)
    doc_string

Что мне нужно сделать, чтобы вывод справки имел вид

Help on method f in module Mod:

f(x, y, z)
    doc_string

как и для random.Random.shuffle, например?

Моя запись PyMethodDef в данный момент:

{ "f", f, METH_VARARGS, "doc_string" }

Ответы [ 2 ]

2 голосов
/ 30 сентября 2008

Вы не можете. Модуль inspect, который используют «pydoc» и «help ()», не может определить точную сигнатуру функции C. Лучшее, что вы можете сделать - это то, что делают встроенные функции: включить подпись в первой строке строки документа:

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

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

...

Причина, по которой строка документации random.shuffle выглядит «правильной», заключается в том, что она не является функцией C. Это функция, написанная на Python.

1 голос
/ 30 сентября 2008

Ответ Томаса, конечно, правильный.

Я бы просто добавил, что многие модули расширения C имеют Python-оболочку вокруг них, чтобы они могли поддерживать стандартные сигнатуры функций и другие функции динамического языка (такие как протокол дескриптора).

...