Как отобразить аргументы функции Cython в документации? - PullRequest
0 голосов
/ 23 мая 2018

Следующий код определяет простую функцию Cython (для удобства используется магия Ipython).

%load_ext cython
%%cython
def f(float x, float y=2):
    return x+y

Затем, вызов help(f) выдает это сообщение:

Help on built-in function f in module _cython_magic_e37eeabbc63d5167217465ba978239fc:

f(...)

Обратите внимание, чтоаргументы f не показаны.Кроме того, завершение табуляции не работает и для имен аргументов в ipython (например, набрав f(x затем tab).

Если я определю эту функцию без использования Cython:

def g(x, y=2):
    return x+y

Вызов help(g) дает это, и завершение табуляции работает, как и ожидалось:

Help on function g in module __main__:

g(x, y=2)

Есть ли способ получить такое поведение с помощью функции Cython?Я пытался с def, cdef, cpdef, с и без магии ipython, но безуспешно.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Не согласен с согласованным ответом.

Хотя включение binding имеет побочный эффект строк документации, отображаемых в коде, оно также связывает все остальные атрибуты класса Python с классами расширения Cython, что приводит к снижению производительности, увеличению памяти для каждого объекта расширения.и т. д.

Правильный флаг для включения строк документации только без побочных эффектов - embedsignature=True.

Может использоваться как декоратор - @cython.embedsignature(True) поверх всех функций или как часть директив cython в setup.py Расширение для применения ко всем функциям Cython - {'embedsignature': True}

С документы :

embedsignature (True / False)

Если установлено значение True, Cython будет вставлять текстовую копию подписи вызова в строку документации всего Pythonвидимые функции и классы.Таким образом, такие инструменты, как IPython и epydoc, могут отображать сигнатуру, которую нельзя получить после компиляции.По умолчанию установлено значение False.

0 голосов
/ 23 мая 2018
import cython

@cython.binding(True)
def f(float x, float y=2):
    # ...

сейчас help(f) дает

Help on cython_function_or_method in module cy_exc:

f(x, y=2.0)

В документации говорится

Если эта функция включена, функции будут привязываться к экземпляру, если рассматривать его как атрибут класса (отсюда и имя), и будут эмулировать атрибуты функций Python, включая интроспекции, такие как имена аргументов и аннотации.По умолчанию установлено значение False.

Вы можете включить опцию компиляции другими способами (например, если вы хотите, чтобы она была включена везде).

Возможно, вы также захотите взглянуть на этот связанный вопрос

...