我使用cython包装一些c ++代码,我不确定使用默认值处理参数的最佳方法是什么。
在我的c ++代码中,我有参数具有默认值的函数。我想以这样的方式包装它们,如果没有给出参数,则使用这些默认值。有没有办法做到这一点?
此时我能看到提供选项参数的唯一方法是将它们定义为python代码的一部分(在下面 pycode.pyx 的def func
声明中),但是我的默认值不止一次定义,我不想要。
cppcode.h :
int init(const char *address=0, int port=0, int en_msg=false, int error=0);
的 pycode_c.pxd :
cdef extern from "cppcode.h":
int func(char *address, int port, int en_msg, int error)
的 pycode.pyx :
cimport pycode_c
def func(address, port, en_msg, error):
return pycode_c.func(address, port, en_msg, error)
答案 0 :(得分:9)
您可以使用不同的参数("cppcode.pxd"
)声明该函数:
cdef extern from "cppcode.hpp":
int init(char *address, int port, bint en_msg, int error)
int init(char *address, int port, bint en_msg)
int init(char *address, int port)
int init(char *address)
int init()
int init(const char *address=0, int port=0, bool en_msg=false, int error=0);
它可以在Cython代码("pycode.pyx"
)中使用:
cimport cppcode
def init(address=None,port=None,en_msg=None,error=None):
if error is not None:
return cppcode.init(address, port, en_msg, error)
elif en_msg is not None:
return cppcode.init(address, port, en_msg)
elif port is not None:
return cppcode.init(address, port)
elif address is not None:
return cppcode.init(address)
return cppcode.init()
并在Python("test_pycode.py"
)中尝试:
import pycode
pycode.init("address")
address 0 false 0
Cython还有arg=*
syntax(在*.pxd
文件中)可选参数:
cdef foo(x=*)