在Cython中处理默认参数
我正在用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)
1 个回答
18
你可以用不同的参数来声明这个函数("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=*
语法(在*.pxd
文件中)来处理可选参数:
cdef foo(x=*)