如何在文档中显示 Cython 函数的参数?

Tom*_*ize 4 cython

以下代码定义了一个简单的 Cython 函数(为了方便起见,使用 Ipython magic)。

%load_ext cython
%%cython
def f(float x, float y=2):
    return x+y
Run Code Online (Sandbox Code Playgroud)

然后,调用help(f)会给出以下消息:

Help on built-in function f in module _cython_magic_e37eeabbc63d5167217465ba978239fc:

f(...)
Run Code Online (Sandbox Code Playgroud)

f请注意,未显示 的参数。此外,制表符补全对于 ipython 中的参数名称也不起作用(例如键入f(xthen tab)。

如果我在不使用 Cython 的情况下定义此函数:

def g(x, y=2):
    return x+y
Run Code Online (Sandbox Code Playgroud)

调用help(g)给出了这个并且制表符完成按预期工作:

Help on function g in module __main__:

g(x, y=2)
Run Code Online (Sandbox Code Playgroud)

有没有办法通过 Cython 函数获得这种行为?我尝试使用def, cdef, cpdef, 有或没有 ipython 魔法,但没有成功。

dan*_*nny 5

不同意同意的答案。

虽然启用确实binding会产生代码中显示文档字符串的副作用,但它还会将所有其他 Python 类属性绑定到 Cython 扩展类,这会导致性能降低、每个扩展对象使用更多内存等。

仅启用文档字符串而没有副作用的正确标志是embedsignature=True

它可以用作装饰器 -@cython.embedsignature(True)在所有函数之上,也可以用作 setup.py 中 cython 指令的一部分扩展以应用于所有 Cython 函数 -{'embedsignature': True}

来自文档

嵌入签名(正确/错误)

如果设置为 True,Cython 将在所有 Python 可见函数和类的文档字符串中嵌入调用签名的文本副本。因此,IPython 和 epydoc 等工具可以显示签名,否则编译后无法检索该签名。默认值为 False。