您可以使用不同的参数声明该函数("cppcode.pxd" https://gist.github.com/6a01dc02e35fb04cf97d#file_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()
Where "cppcode.hpp" https://gist.github.com/6a01dc02e35fb04cf97d#file_cppcode.hpp:
int init(const char *address=0, int port=0, bool en_msg=false, int error=0);
它可以在 Cython 代码中使用("pycode.pyx" https://gist.github.com/6a01dc02e35fb04cf97d#file_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" https://gist.github.com/6a01dc02e35fb04cf97d#file_test_pycode.py):
import pycode
pycode.init("address")
Output
address 0 false 0
赛通也有arg=* syntax http://docs.cython.org/src/userguide/pyrex_differences.html#optional-arguments-in-cdef-cpdef-functions (in *.pxd
文件)用于可选参数:
cdef foo(x=*)