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

时间:2018-05-23 16:07:15

标签: cython

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

%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的参数未显示。此外,tab-completion对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函数获得此行为?我尝试使用defcdefcpdef,使用和不使用ipython魔法,但没有成功。

2 个答案:

答案 0 :(得分:1)

不同意约定的答案。

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

启用文档字符串且没有副作用的正确标记是embedsignature=True

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

来自docs

  

embedsignature(真/假)

     

如果设置为True,Cython将在所有Python可见函数的docstring中嵌入调用签名的文本副本,   类。 IPython和epydoc等工具可以显示签名,   编译后无法检索。默认是   假

答案 1 :(得分:0)

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)

The documentation

  

启用后,函数将在查找为类属性(因此名称)时绑定到实例,并将模拟Python函数的属性,包括参数名称和注释等内省。默认值为False。

您可以通过其他方式启用编译选项(例如,如果您希望在任何地方启用它)。

您可能还想查看this related question