以下代码定义了一个简单的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函数获得此行为?我尝试使用def
,cdef
,cpdef
,使用和不使用ipython魔法,但没有成功。
答案 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)
启用后,函数将在查找为类属性(因此名称)时绑定到实例,并将模拟Python函数的属性,包括参数名称和注释等内省。默认值为False。
您可以通过其他方式启用编译选项(例如,如果您希望在任何地方启用它)。
您可能还想查看this related question